_cnt);while(getchar() != \n);printf("%d\n",stdin->_cnt);return 0;} 不断取出字符直到最后取出的字符为换行符,其实将代码稍微修。C语言深入标准输入输出( 四 )。" />

C语言深入标准输入输出( 四 )


#include int main(){scanf("%s");printf("%d\n",stdin->_cnt);while(getchar() != '\n');printf("%d\n",stdin->_cnt);return 0;}
不断取出字符直到最后取出的字符为换行符,其实将代码稍微修改下就能输出缓存中的字符:
#include int main(){scanf("%s");printf("%d\n",stdin->_cnt);while(putchar(getchar()) != '\n');printf("%d\n",stdin->_cnt);return 0;}
方法虽笨但有助于查看缓冲区内容,例如我们通过下面代码查看部分匹配成功后缓冲区中剩下的内容:
#include int main(){int a;scanf("%d",&a);if (stdin->_cnt)while(putchar(getchar()) != '\n');return 0;}
输入,因为匹配到字符a时会因为类型不符而停止匹配,缓存中剩下abc和一个’\n’,输出结果也是如此,当我们使用scanf()发生意外错误时,可以通过此方法检测缓存来查找原因 。后面我们学了正则表达式后也可以通过正则表达式清除缓存,但无法查阅缓存内容,这部分内容我们放到后面讲解 。
由于scanf()总是受到缓存的干扰,并且还有一个缺点是不能返回输入字符的内容,必须声明一个变量来赋值,有没有其它便利的方法呢?有的,标准库提供了一些更简洁的函数来获取字符和字符串:
() 获取一个字符,并返回它
() 输出一个字符,并返回它
gets() 获取一个字符串,并返回它
puts() 输出一个字符串,并返回它
c=()相当于scanf(“%c”, c),使用起来更加方便 。当我们想在屏幕上输出一个字符串时,通常会使用(“字符串\n”)来输出,每次都要加上\n来换行显得麻烦,此时可以使用puts(“字符串”),它会自动添加换行符 。当我们想输入带空格的字符串时,scanf(“%s”,str)是不能获取完整内容的,此时可以使用gets(str),这个函数可以保留字符串中的空格,还能自动将缓冲区的回车取出来丢弃,不会对接下来输入的内容造成影响,一举两得,因此获取字符和字符串推荐使用这些便捷函数 。有人会问那为什么不提供获取数值的便捷方法呢?其实坐下来想想就不难发现,只要转换字符串为数值就行,例如:
#include #include int main(){char str[20]="";int a = atoi(gets(str));long b = atol(gets(str));float c = atof(gets(str));printf("%d,%ld,%f\n",a,b,c);puts(itoa(a,str,20));puts(ltoa(b,str,20));puts(gcvt(c,3,str));return 0;}
库中提供了数值和字符串互相转换的函数,但是调用两个函数来输入输出未必比()和scanf()简洁,实际上()和scanf()也是调用这些函数进行数值转换的 。当输入输出数值时我还是偏向使用()和scanf() 。()和scanf()也有它高效的地方,那就是一次输出和输出多个变量,如果需要格式化输入输出也只能选择()和scanf() 。
掌握scanf()运行机制和缓存的秘密后很多问题都迎刃而解了,现在轮到我们利用scanf()的优点来高效输入数据了,第一个用途是输入数组元素,例如:
#include int main(){int a[5];scanf("%d,%d,%d,%d,%d",a,a+1,a+2,a+3,a+4);printf("%d,%d,%d,%d,%d",a[0],a[1],a[2],a[3],a[4]);}
上面代码必须输入逗号分隔数组元素,当数组元素不多时,使用这种方式很方便,但是当数组元素较多时就需要使用循环了,如果你使用for(i=0;i
#include int main(){int a[5];int i;for(i=0;i<5;i++) scanf("%d%c",a+i);for(i=0;i<5;i++) printf("%d ",a[i]);}
这里每读取一个元素后,用%c清除间隔符,不管是用空格还是逗号当间隔符都可以,最后一个%c清除缓存中的回车 。