scanf()函数用法规则探索——c语言,以及%c和%s的语法特性

一: 针对%c读入

  1. 从以上程序测得,对于%c 来说 scanf()接收键盘输入的所有东西,遇回车结束输入 ,可以读入空格,句号
  2. 当scanf以%c接收一串字符时,每次只能接收一个字符,即单个字符
  3. 我们用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]);  //千万不要忘记&   取地址符

未完待续.........................

 

 

 

 

 

 

  • 43
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值