[关闭]
@yy0518 2016-03-11T09:00:04.000000Z 字数 2040 阅读 1052

C-15 scanf_s和循环

C语言学习笔记


1 scanf_s()
本身是想看第六章的,然而刚开始看就卡在了scanf()函数的返回值上。虽然之前看过(补充一下输入错误EOF的值一般被定义为-1),但突然很好奇如果输入的是%s的形式的字符串的话,函数的返回值会是什么。然而悲剧的是新装的VS在运行scanf()函数时居然出现了C4996错误。

  1. ####include“stdio.h”
  2. ####pragma warning(disable:4996) //表示将4996警报设置为失效
  3. int main()
  4. {
  5. int a = 0, i;
  6. char yy[10];
  7. scanf_s("%s", yy, 10);
  8. for (i = 0;i < 10;i++)
  9. {
  10. printf("%c\n", yy[i]);
  11. }
  12. return 0;
  13. }

【_s和####pragma warning(disable:4996)可以选一个就好了】
scanf_s()相比scanf()多了一个缓冲区大小的参数,表示最多读取n-1长度的字符。
对于scanf_s()输入字符串的返回值:当输入的没有超过n-1时,则返回值为1;若长度超过了n-1则返回值为0.
但对于scanf()函数,超过了字符串范围返回值依然为1,但是会出错。
这是我自己试验的,不知道是否具有一般性。
而对于如下的程序:

  1. ####include "stdio.h"
  2. ####pragma warning(disable:4996)
  3. int main()
  4. {
  5. int a = 0, i,b,c,d;
  6. char yy[10];
  7. a=scanf("%d%d", &b,&c);
  8. printf("返回值:%d 输入的两个整型值:%d %d\n",a, b, c);
  9. d=scanf("%s", yy);
  10. printf("字符串输入函数的返回值:%d\n", d);
  11. for (i = 0;i < 10;i++)
  12. {
  13. printf("%c\n", yy[i]);
  14. }
  15. return 0;
  16. }

运行结果:
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⊙)…
但下面的函数

  1. ####include <stdio.h>
  2. int main()
  3. {
  4. char ch;
  5. scanf("%c", &ch);
  6. printf("%c", ch);
  7. ch = getchar();
  8. putchar(ch);
  9. return 0;
  10. }

结果为:
。。
。请按任意键继续
不明白是为什么。。

4 居然在书上发现了统计字数的程序,但是它没有考虑到can't这样的单词,而且对于判断输入是否结束需要一个结束字符,所以在输入时如果文字段本身有这个结束字符,那么就悲剧了。但是它的输入方法以及判断还是蛮值得借鉴的。稍微修改一下还是可以用的。但是鉴于现在要出发去大唐遗址公园玩耍了,所以留给下次再慢慢修改吧~


作业

1 请对我写了的scanf_s进行补充或指正。
2 请解答为什么会出现3中的情况。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注