C指针原理(96)-C基础综合应用

fgets(由文件中读取一字符串) 
相关函数 open,fread,fscanf,getc 
表头文件 include<stdio.h> 
定义函数 har * fgets(char * s,int size,FILE * stream); 
函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。 
返回值 gets()若成功则返回s指针,返回NULL则表示有错误发生。 
范例 #include<stdio.h>
main()
{
char s[150];
fputs(fgets(s,150,stdin),stdout);
}

执行 ,输入:

Hello world

输出:

Hello world


fputs(将一指定的字符串写入文件内) 
相关函数 fopen,fwrite,fscanf,fputc,putc 
表头文件 #include<stdio.h> 
定义函数 int fputs(const char * s,FILE * stream); 
函数说明 fputs()用来将参数s所指的字符串写入到参数stream所指的文件内。 
返回值 若成功则返回写出的字符个数,返回EOF则表示有错误发生。 

fgets()存储输入中的换行符,而fputs()也不为输出添加换行符。

strtok()用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数delimiters的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL

C/C++中的Split函数是strtok()其函数原型如下
char * strtok (char * str, const char * delimiters); 
函数说明 
strtok()用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串,当strtok()在参数str的字符串中发现到参数delimiters的分割字符时则会将该字符改为'\0'字符。在第一次调用时,strtok()必需给予参数str字符串,往后的调用则将参数str设置成NULL。每次调用成功则返回下一个分割后的字符串指针。 
返回值 返回下一个分割后的字符串指针,如果已无从分割则返回NULL

 

下面到底哪个是数组指针,哪个是指针数组呢:
A)
long *pa[6];
B)
long (*pb)[6];
每次上课问这个问题,总有弄不清楚的。这里需要明白一个符号之间的优先级问题。

   “[]”的优先级比“*”要高。

    pa 先与“[]”结合,构成一个数组的定义,数组名为pa,long *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向long 类型数据的指针,即指针数组。

    至于pb ,“()”的优先级比“[]”高,“*”号和pb 构成一个指针的定义,指针变量名为pb,long 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。pb 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针。

下面程序完成一个简单的单机投票系统:

1. 1.dat与2.dat存放了2个投票的相关内容,投票内容可以依次增多,按数字增序排列。

1.dat:

4

您最喜欢的语言

javascript

python

C++

java

2

2.dat:

 

4

您最喜欢的操作系统

windows

ubuntu

freebsd

Solaris

1

2.投票程序每次运行后都会读取上次投票的结果,并保存本次投票结果,结果保存为csv文件。

3.候选人及相关数据保存在下面2个结构中tphsr.h:

#ifndef TPHSR_H_INCLUDED

#define TPHSR_H_INCLUDED\

//候选人结构

struct tp_hsr{

   int id;

   char name[10];//候选人

   int  sel_count;//候选人选票

};

typedef struct tp_hsr TpHsr;

struct tp_hsr_info{

   TpHsr *tphsr;//候选人明细

   int hsrcount;//候选人总数

   char outfn[200];//候选人导出文件名

   char xzinfo[200];//选举内容

   int sel_max;//最大候选人

};

typedef struct tp_hsr_info TpHsrInfo;

 

 

 

 

 

 

#endif // TPHSR_H_INCLUDED

其它代码如下:

tp.h:

#ifndef TP_H_INCLUDED

#define TP_H_INCLUDED

#include <string.h>

#include <conio.h>

#include "tphsr.h"

#define PASSWD_LEN 100//密码最大长度

#define HSR_MAXLEN 100//候选人模板每行长度

#define TMPL_FL_PATH "template/"

#define FDCOUNT 2

void showbegin(){

    system("cls");

    printf("   *  ****   ***********  *     *        *             ****    *    *   \n");

    printf("   *  *  *       * *       *  * *     *   *   *   *****        *     *  \n");

    printf("   *  *  *    *********       *****    *     *       *        *   ******\n");

    printf(" **** *  *    *  * *  *      *  *    ***********    *    *   *  *   *   \n");

    printf("   * *    **  *********  ***    *       *   *      ******    ***   *  * \n");

    printf("   *                       * *******   *  *  *        **       *  *    *\n");

    printf("   * ******   *********    *   * *   **   *   **    **    *   *   ******\n");

    printf("   ** *   *                *   * *    *********   ********** ****  * * *\n");

    printf(" ***   * *   ***********   *  *  * *      *           *    *       * *  \n");

    printf("   *    *         *        * *    ** ***********   *  *  *     **  * *  \n");

    printf("   *   * *     *  *  *    * *             *       *   *   *  **   *  * *\n");

    printf("  ** **   **  *  **   *  *   *******      *      *   **    *     *    **\n");

    printf("             \n投 好 庄 严  一 票\n  ");

    printf("      #     #######            #      #####             #               \n");

    printf("   #  #      #   #          #  #     #  #  #         #  #      #####    \n");

    printf("  #    #     #   #         #    #    #  # #         #    #       #      \n");

    printf(" #      #  #########      #      #    # # #        #      #   #  #      \n");

    printf("    #        #   #           #          #             #       #  ###    \n");

    printf("   #   #     #   #          #   #    #######         #   #    #  #      \n");

    printf("   #   #    #    #          #   #       #            #   #    #  #      \n");

    printf("   #### #   #    #          #### #      #            #### #   #######   \n");

}

TpHsrInfo* read_hsr_template(char *templ_fn){

  //读取候选人模板文件

  FILE *hsrfp;

  int hsrcount=0;

  char strline[HSR_MAXLEN];

  char myfilename[200]="";

  char outfn[200]="";

  char *xz_info;

  strcat(myfilename,TMPL_FL_PATH);

  strcat(myfilename,templ_fn);

  if((hsrfp = fopen(myfilename,"rt")) == NULL)

  {

      return NULL;

  }

 

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/

  //取得候选人总数

  //第一行为候选人总数

  fgets(strline,HSR_MAXLEN,hsrfp);

  hsrcount=atoi(strline);

  //取得选举内容

  //第二行为选举内容

  fgets(strline,HSR_MAXLEN,hsrfp);

  xz_info=strline;

 

  TpHsrInfo *myhsrinfo=(TpHsrInfo*)malloc(sizeof(TpHsrInfo));

  TpHsr *myhsr=malloc(sizeof(TpHsr)*hsrcount);

  myhsrinfo->tphsr=myhsr;

  myhsrinfo->hsrcount=hsrcount;

 

  strncpy(myhsrinfo->xzinfo,xz_info,strlen(xz_info)-1);

  myhsrinfo->xzinfo[strlen(xz_info)-1]='\0';

 

 

  strcat(outfn,myhsrinfo->xzinfo);

  strcat(outfn,".csv");

  strcpy(myhsrinfo->outfn,outfn);

 

  int i=0;

  while (!feof(hsrfp))

  {

    fgets(strline,HSR_MAXLEN,hsrfp);  //读取一行

    strline[strlen(strline)-1]='\0';

    myhsrinfo->tphsr[i].id=i+1;

    strcpy(myhsrinfo->tphsr[i].name,strline);

    myhsrinfo->tphsr[i].sel_count=0;

 

    i++;

    if (i>=hsrcount) break;

  }

  fgets(strline,HSR_MAXLEN,hsrfp);

  myhsrinfo->sel_max=atoi(strline);

  fclose(hsrfp);

 

  return myhsrinfo;

}

TpHsrInfo* load_hsr(char *templ_fn ){

//读文件

  FILE *hsrin_fp;

  int hsrcount=0;

  int i=0;

  const char *csvflag=",";

  char * p;

  char strline[HSR_MAXLEN+10];

  int sel_ct=0;

  char* sel_ctstr[5];

  TpHsrInfo *tphsrinfo=read_hsr_template(templ_fn);

  if(tphsrinfo==NULL){

      return NULL;

  }

 

  if((hsrin_fp = fopen(tphsrinfo->outfn,"rt")) == NULL)

  {

      return tphsrinfo;

  }

  while (!feof(hsrin_fp))

  {

    fgets(strline,HSR_MAXLEN+10,hsrin_fp);

    p = strtok (strline,csvflag);

    p = strtok(NULL,csvflag);

 

    if (!p) break;

    strcpy(sel_ctstr,p);

 

    sel_ct=atoi(sel_ctstr);

    tphsrinfo->tphsr[i].sel_count=sel_ct;

    i++;

  }

  fclose(hsrin_fp);

  return tphsrinfo;

}

 

void save_hsr(TpHsrInfo *tphsrinfo){

//写文件

  FILE *hsrout_fp;

  int hsrcount=0;

  char linestr[300]={0};

  int i=0;

  char sel_ctstr[5]="";

 

  if((hsrout_fp = fopen(tphsrinfo->outfn,"wt")) == NULL)

  {

      printf("%s创建错误!",tphsrinfo->outfn);

      return NULL;

  }

 

  for(i=0; i<tphsrinfo->hsrcount;i++)

    {

        strcpy(linestr,tphsrinfo->tphsr[i].name);

 

 

        strcat(linestr," ,");

        sprintf(sel_ctstr,"%d",tphsrinfo->tphsr[i].sel_count);

 

        strcat(linestr,sel_ctstr);

        strcat(linestr,"\n");

 

        fputs(linestr,hsrout_fp);

    }

    fclose(hsrout_fp);

}

 

int select_hsr(TpHsrInfo *tphsrinfo){

    //显示候选人

    int i=0;

    int xz=0;

    int hsrsel_max=tphsrinfo->sel_max;

    int now_selhsr_ct=1;

    system("cls");

    printf("-------%s\-------\n",tphsrinfo->xzinfo);

    for(i=0; i<tphsrinfo->hsrcount;i++)

    {

        printf("%d-",tphsrinfo->tphsr[i].id);

        printf(tphsrinfo->tphsr[i].name);

        printf("  票数:%d",tphsrinfo->tphsr[i].sel_count);

        printf("\t");

        if ((i+1)%FDCOUNT==0) printf("\n");

    }

    printf("请输入编号(输入0表示弃权):");

    scanf("%d",&xz);

    while (1){

       if (xz<0 || xz>tphsrinfo->hsrcount){

 

           printf("-------%s\-------\n",tphsrinfo->xzinfo);

            for(i=0; i<tphsrinfo->hsrcount;i++)

           {

           printf("%d-",tphsrinfo->tphsr[i].id);

           printf(tphsrinfo->tphsr[i].name);

           printf("  票数:%d",tphsrinfo->tphsr[i].sel_count);

           printf("\t");

           if ((i+1)%FDCOUNT==0) printf("\n");

          }

          i=0;

          printf("请输入编号:");

          scanf("%d",&xz);

       }

       else if (xz==0) {

            printf("您弃权了!");

            return 0;

       }

       else {

            printf("您选择:%d-%s",tphsrinfo->tphsr[xz-1].id,tphsrinfo->tphsr[xz-1].name);

            tphsrinfo->tphsr[xz-1].sel_count++;

            now_selhsr_ct++;

            if (now_selhsr_ct<=hsrsel_max) {

                xz=-1;

                continue;

            }

            return 1;

       }

    }

}

void showtip(){

    printf("\n每位候选人均有一个编码,输入选中的编码后,按回车键即表示投票!\n按任意键开始投票\n");

    getch();

}

int passwd_check(){

    //密码检测,成功返回1,否则返回0

    showbegin();

    int i;

    char mypass[100];

    char accept[]="gxds"; //正确登录密码

    printf("投票选举系统\n");

    printf("请输入密码:");

    char pswd;

    for(i=0; i<PASSWD_LEN-1; i++)

    {

        pswd=getch();

        if (pswd==0x0d) break;

        else mypass[i]=pswd;

        printf("*");

    }

    mypass[i]='\0';

    if (strcmp(mypass,accept)==0)

    {

       printf("\n密码正确!下面开始投票!\n");

       return 1;

    }

    else{

       printf("\n密码错误!按任意键退出程序!\n");

       getch();

       return 0;

    }

}

#endif // TP_H_INCLUDED

Main.c

//投票软件-单机版

//纯C,请使用code::blocks打开工程,并编译

#include <stdio.h>

#include "tp.h"

#define TPL_MAX 20

 

 

int main(int argc,char *argv[]){

   int is_pass=passwd_check();

   TpHsrInfo *tphsrinfo[TPL_MAX];

   int  now_jx=0;

   char nowjxfn[20]="";

   int  max_jx=0;

 

 

   while(1){

   if (is_pass) {

       sprintf (nowjxfn,"%d",now_jx+1);

       strcat(nowjxfn,".dat");

       tphsrinfo[now_jx]=load_hsr(nowjxfn);

       if (tphsrinfo[now_jx]==NULL) {

            max_jx=now_jx;

            break;

       }

       showbegin();

       showtip();

       select_hsr(tphsrinfo[now_jx]);

       now_jx++;

   }

   else return 0;

   }

   now_jx=0;

   for (now_jx=0;now_jx<max_jx;now_jx++){

       save_hsr(tphsrinfo[now_jx]);

       free(tphsrinfo[now_jx]->tphsr);

       free(tphsrinfo[now_jx]);

   }

   return 0;

}

 

 

 

 C指针原理(96)-C基础综合应用_第1张图片

C指针原理(96)-C基础综合应用_第2张图片



C指针原理(96)-C基础综合应用_第3张图片

 

 

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/

 

你可能感兴趣的:(C语言)