赞
踩
我们while循环加入两句话:scanf("%c ",&ch);
printf("输出为%c:",ch);
1.scanf会继续读入键盘所输入的字符(因为"fg!"还在键盘缓冲区?(关于这个问题,网上我所见的说法都是如此,但是,经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)
-
- char ch;
- scanf("%5s",&ch);
- printf("%s\n",ch);
在之前的c_primer读书笔记里有:字符串是个特列,他的存储方式是数组,
如果用char型来定义,我们必须定义一个数组来存放字符串,
如果不用数组定义,也可以 这样定义:char *ch = "dfsfs",但这样定义的ch是一个常量,存放于程序的数据区,是无法进行更改的,要想操作字符串,只能用数组方式,引入变量区
1.可以得出%s读入字符串时:遇到空格,回车就会结束读入
2.奇怪的是第一个ch长度为6,输入了远超过6,竟然不报错!!!!!不会数组越界吗?(可以用宽度限制读入的长度,避免意外错误) 如下所示:
3.第二种第一方法其实是隐形的定义了字符串长度
4.同%c一样,输入的lian还在STdin流中,故而第二个scanf进行扫描时,自然读入lian
1.一般我们都希望接收的是我们当前想要传送的值,所以需要清除以前的缓冲区
解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch(); getchar();也可以,但是要视具体scanf()语句加那个,但是加fflush(stdin);不管什么情况都可行。
也可以通过空格来解决:scanf(" %s",&ch);可以自己测试一下结果
对于你的scanf()如果不能接收数据,(少接受一些数据)那么赶紧刷新缓冲区吧
1.
如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参数;
如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语
这里为了保证输入参数个数正确,可以利用scanf()函数的返回值来作为判断,输入正确的个数才结束输入
1.对于以上利用返回值来判断,如果输入的类型不匹配,会出现什么问题呢? 答案:无限循环
因为,缓冲区的信息残留问题,所以我们加入flush(stdin)即可
# include <stdio.h> ;
int scanf( const char *format, ... );
函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。
在 C99 中,format 用 restrict 修饰。
format 指向的控制串由以下三类字符组成:
● 格式说明符
● 空白符
● 非空白符
因为:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符
测试程序如下:
1,出现了一个问题:最后两个scanf()没有读入,直接跳过了?
经过单独测试逗号问题发现:会跳过是因为逗号的输入是中文,改为英文格式便正确
还是别用逗号隔开了
2. 用逗号隔开要注意,不能再用别的分隔符,同时逗号一定在输入的东西后面,就是得紧跟着
3. 对于无显示分隔符时,手动输入时:Tab,空格,回车可以混合使用
4. 百分号(%)与格式符之间的星号(*)表示读指定类型的数据但不保存
5. scanf("%dfd%d%d",&a,&b,&c);//也不能正确输出
6.
可以看出字符ch就是一个字符,输入df,只把 f 赋给了ch,f还在缓冲区中,之后ch 又被改为 'c'
7. char ch[10];
scanf("%c",&ch[3]); //千万不要忘记& 取地址符
未完待续.........................
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。