zoukankan      html  css  js  c++  java
  • 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] = '';                     //添加字符串结束符
    116                     
    117             count++;                         //匹配到的变量个数加一
    118         }        
    119     }
    120         
    121     va_end(ap);
    122     
    123     return count;
    124 }
    125 
    126 #endif 
  • 相关阅读:
    内网穿透
    canvas 满天星
    swift 获取文件的Md5值
    swift UITextView内容距离边框边距设置
    swift UITextField光标聚焦以及光标颜色修改
    swift3.0 移除当前页面的前一个页面
    swift3.0 屏幕截图并且保存到本地相册
    swift3.0 UITableView侧滑支持多选项
    swift3.0 点击UIScrollView中输入框之外的区域关闭键盘
    swift3.0 底部弹出菜单 UIAlertController的使用
  • 原文地址:https://www.cnblogs.com/hongdoudou/p/12510130.html
Copyright © 2011-2022 走看看