Scanf--数据第一个字符是西文字符的scanf函数

测试数据时使用的Scanf函数,详细注释,希望能帮助你理解,写测试数据文件的时候可以加入中文说明,因为会跳过非西文字符直到遇到第一个西文字符(也就是说字符串不能以非西文字符开头)

  1 /*********************
  2  *                   *
  3  * 文件夹: ▲01 绪论 *
  4  *                   *
  5  * 文件名: Scanf.c   *
  6  *                   *
  7  *********************/
  8 
  9 #ifndef SCANF_C
 10 #define SCANF_C
 11 
 12 #include <stdio.h>
 13 #include <string.h>
 14 #include <stdarg.h>                //提供宏va_list、va_start、va_arg、va_end    
 15 #include <ctype.h>                 //提供isprint原型 
 16 
 17 /*
 18     自定义的数据录入函数,用于从文件fp
 19 中读取格式化的输入。
 20 
 21     与fscanf不同之处在于此函数只会读取
 22 西文字符,对于中文字符,则会跳过。 
 23 */
 24 
 25 int Scanf(FILE *fp, char *format, ...)
 26 {
 27     int *i;
 28     char *ch, *s;
 29     float *f;
 30     int count, k, len, n;        
 31     int tmp;
 32     va_list ap;
 33     
 34     len = strlen(format);
 35     
 36     va_start(ap, format);
 37     
 38     for(count=0,k=2; k<=len; k=k+2)
 39     {
 40         while((tmp=getc(fp))!=EOF)            //跳过非西文字符直到遇到第一个西文字符 需注意getc返回值类型为int
 41         {
 42             if((tmp>=0 && tmp<=127))
 43             {
 44                 ungetc(tmp, fp);            //遇到首个西文字符,将此西文字符放入输入流 
 45                 break;
 46             }
 47         }
 48         
 49         if(tmp==EOF)
 50             break;
 51         
 52         if(format[k-1]=='c')                //读取字符         
 53         {
 54             ch = va_arg(ap, char*);
 55                         
 56             if(tmp!=EOF)
 57                 count += fscanf(fp, "%c", ch);                    
 58         }    
 59         
 60         if(format[k-1]=='d')                //读取整型 
 61         {
 62             i = va_arg(ap, int*);
 63             
 64             while((tmp=getc(fp))!=EOF)    //相当于找到整型的起始位置
 65             {
 66                 if((tmp>='0' && tmp<='9') || tmp=='-' || tmp=='+')  //! ---> & ---> ^ ---> | ---> && ---> ||
 67                 {
 68                     ungetc(tmp, fp);     //将找到的整型起始位置写入缓冲区
 69                     break;
 70                 }
 71             }
 72             
 73             if(tmp!=EOF)
 74                 count += fscanf(fp, "%d", i);  //从缓冲区开始取走数据
 75         }
 76 
 77         if(format[k-1]=='f')                //读取浮点型 
 78         {
 79             f = va_arg(ap, float*);
 80             
 81             while((tmp=getc(fp))!=EOF)
 82             {
 83                 if((tmp>='0' && tmp<='9') || tmp=='-' || tmp=='+'|| tmp=='.' )
 84                 {
 85                     ungetc(tmp, fp);
 86                     break;
 87                 }
 88             }
 89             
 90             if(tmp!=EOF)
 91                 count += fscanf(fp, "%f", f);
 92         }
 93         
 94         if(format[k-1]=='s')                //读取字符串 
 95         {
 96             s = va_arg(ap, char*);
 97             
 98             while((tmp=getc(fp))!=EOF && (!isprint(tmp) || tmp==' '))   //从缓冲区取一个新字符
 99                 ;
100             
101             n = 0;
102             if(!feof(fp))
103             {
104                 ungetc(tmp, fp);             //再将字符输入回缓冲区
105                 while((tmp=getc(fp))!=EOF)   //从0开始取字符串,再从缓冲区取字符串
106                 {
107                     if(isprint(tmp) && tmp!=' ')
108                         s[n++] = tmp;
109                     else
110                         break;    
111                 }
112                 ungetc(tmp, fp);             //将取到的字符写回缓冲区以供下次使用    
113             }
114                                                                                 
115             s[n] = '\0';                     //添加字符串结束符
116                     
117             count++;                         //匹配到的变量个数加一
118         }        
119     }
120         
121     va_end(ap);
122     
123     return count;
124 }
125 
126 #endif 

 

posted @ 2020-03-17 13:33  洪豆豆的记录  阅读(231)  评论(0编辑  收藏  举报