%s
一: 针对%c读入
- 从以上程序测得,对于%c 来说 scanf()接收键盘输入的所有东西,遇回车结束输入 ,可以读入空格,句号
- 当scanf以%c接收一串字符时,每次只能接收一个字符,即单个字符
- 我们用while测试可知:只要是键盘输入的字符,调用他时就会自动接收,并且接收后自动指向下一个位置,要不然怎么接收的an...后面的一串串,直到遇到回车
我们while循环加入两句话:scanf("%c ",&ch);
printf("输出为%c:",ch);
1.scanf会继续读入键盘所输入的字符(因为"fg!"还在键盘缓冲区?(关于这个问题,网上我所见的说法都是如此,但是,经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)
二: 针对%s读入
1.下面的程序是错的
char ch;
scanf("%5s",&ch);
printf("%s\n",ch);
在之前的c_primer读书笔记里有:字符串是个特列,他的存储方式是数组,
如果用char型来定义,我们必须定义一个数组来存放字符串,
如果不用数组定义,也可以 这样定义:char *ch = "dfsfs",但这样定义的ch是一个常量,存放于程序的数据区,是无法进行更改的,要想操作字符串,只能用数组方式,引入变量区
2.我们再测试%s是否同%c一样什么都可以读入呢?
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()如果不能接收数据,(少接受一些数据)那么赶紧刷新缓冲区吧
四:对于scanf参数列表不匹配问题
1.
如果和第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参数;
如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语
这里为了保证输入参数个数正确,可以利用scanf()函数的返回值来作为判断,输入正确的个数才结束输入
五:scanf非法输入问题
1.对于以上利用返回值来判断,如果输入的类型不匹配,会出现什么问题呢? 答案:无限循环
因为,缓冲区的信息残留问题,所以我们加入flush(stdin)即可
六:scanf用法的一些注意点
1.函数原型:
# include <stdio.h> ;
int scanf( const char *format, ... );
函数 scanf() 是从标准输入流 stdin 中读内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。
在 C99 中,format 用 restrict 修饰。
format 指向的控制串由以下三类字符组成:
● 格式说明符
● 空白符
● 非空白符
2.在scanf()中最好不要加换行符\n 即最好不要写成这样:会提醒让你输入两次
因为:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括空格,制表符,换行符,回车符和换页符
3.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]); //千万不要忘记& 取地址符
未完待续.........................
相关阅读
平均年收入:约36万人民币最大年收入:约96万人民币求人件数:2200件(按汇率为0.06计算)Go:(又称Golang)是Google开发的一种静态强类型、编译
概述在人工智能中,自然语言处理是一门极其深奥的领域,自然语言处理在广义上分为两部分,第一部分自然语言理解,是指让电脑“听懂”人类
浅谈C语言数据结构——链式堆栈 看到标题点进来的朋友,应该对黑客这个名词很敏感吧?我想应该是这样的,但是你们知道作为一名黑客需要
服务端客户端通信例子:socket tcp 通信1,socket tcp通信2,udp使用讲解,socket udp通信例子 1. TCP/IP协议 叫做传输控制/网际协议,又
数据在计算机中以补码存储 移位运算符:<< 左移运算符 >> 右移运算符一丶 << 左移运算符