@yy0518
2016-03-11T09:00:04.000000Z
字数 2040
阅读 1052
C语言学习笔记
1 scanf_s()
本身是想看第六章的,然而刚开始看就卡在了scanf()函数的返回值上。虽然之前看过(补充一下输入错误EOF的值一般被定义为-1),但突然很好奇如果输入的是%s的形式的字符串的话,函数的返回值会是什么。然而悲剧的是新装的VS在运行scanf()函数时居然出现了C4996错误。
####include“stdio.h”####pragma warning(disable:4996) //表示将4996警报设置为失效int main(){int a = 0, i;char yy[10];scanf_s("%s", yy, 10);for (i = 0;i < 10;i++){printf("%c\n", yy[i]);}return 0;}
【_s和####pragma warning(disable:4996)可以选一个就好了】
scanf_s()相比scanf()多了一个缓冲区大小的参数,表示最多读取n-1长度的字符。
对于scanf_s()输入字符串的返回值:当输入的没有超过n-1时,则返回值为1;若长度超过了n-1则返回值为0.
但对于scanf()函数,超过了字符串范围返回值依然为1,但是会出错。
这是我自己试验的,不知道是否具有一般性。
而对于如下的程序:
####include "stdio.h"####pragma warning(disable:4996)int main(){int a = 0, i,b,c,d;char yy[10];a=scanf("%d%d", &b,&c);printf("返回值:%d 输入的两个整型值:%d %d\n",a, b, c);d=scanf("%s", yy);printf("字符串输入函数的返回值:%d\n", d);for (i = 0;i < 10;i++){printf("%c\n", yy[i]);}return 0;}
运行结果:
1 2 34
返回值:2 输入的两个整型值:1 2
字符串输入函数的返回值:1
3
4
?
?
?
?
?
?
?
请按任意键继续...
结果分析:
首先,连续用到了两次scanf()函数。第一个读入两个整型数据,第二个读入一个字符串。整型数据间以空格或是回车作为数之间的间隔,而输入字符串时遇到空格或者回车表示字符串输入结束。正常的话,按照程序的顺序,需要输入两次,但如果第一次输入的太多,超过了两个%d的范围,那么后续的输入会识别为后续的字符串的输入。
输出缓冲区中刷新输出的方法已经介绍过了,那对于输入缓冲区,如果输入缓冲区里有数据,或者上一次输入的数据太多,那么键盘所输入的数据并不会及时被读入,所以应该及时地清空输入缓冲区。清空之后就不会出现上面的情况了。
三种清空输入缓冲区的方法:
(1)fflush(stdin);然而这种方法在VS2015上并没有什么用,我建的是.c的文件。
(2)setbuf(stdin, NULL);即将默认的有缓冲区的方式改为无缓冲区的方式,这个可行。
(3)char ch;while((ch = getchar()) != '\n' && ch != EOF);这个据说是最好用的,因为采用的是C语言的语法,确实很好用。
然而,百度了半天这些个函数,还在纠结缓冲区和流的问题的时候,发现书上第8章介绍了很详细,而且很形象很好懂,这本书确实写得棒棒哒~点个赞!但还是按照书的顺序一步步来吧。
2 C控制语句:循环
(1)把scanf()函数的返回值作为是否循环的条件,看上去还蛮新奇的。如while((scanf(“%d”,&num)==1)) { }在不知道要对输入的多少个数求和时可以采用这种方式.
(2)对于while()、do while、for(),个人觉得只需要知道它们的流程图怎么画的就差不多了,而在使用时,哪种使用起来比较方便就使用哪种就好了。
(3)而逗号表达式对于for()循环而言,使用起来很方便。
3 getchar()和putchar()
这两个函数是针对字符处理的函数。
yy=getchar();和scanf(“%c”,&yy);是一样的效果
putchar(yy);和printf(“%c”,yy);是一样的效果
好像这样的方式不支持中文输入法下的标点符号(⊙o⊙)…
但下面的函数
####include <stdio.h>int main(){char ch;scanf("%c", &ch);printf("%c", ch);ch = getchar();putchar(ch);return 0;}
结果为:
。。
。请按任意键继续
不明白是为什么。。
4 居然在书上发现了统计字数的程序,但是它没有考虑到can't这样的单词,而且对于判断输入是否结束需要一个结束字符,所以在输入时如果文字段本身有这个结束字符,那么就悲剧了。但是它的输入方法以及判断还是蛮值得借鉴的。稍微修改一下还是可以用的。但是鉴于现在要出发去大唐遗址公园玩耍了,所以留给下次再慢慢修改吧~
1 请对我写了的scanf_s进行补充或指正。
2 请解答为什么会出现3中的情况。