Scanf--数据第一个字符是西文字符的scanf函数
Posted 洪豆豆的记录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Scanf--数据第一个字符是西文字符的scanf函数的主要内容,如果未能解决你的问题,请参考以下文章