必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-06-25 19:44:16来源:IT技术作者:seo实验室小编阅读:52次「手机版」
 

%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]);  //千万不要忘记&   取地址符

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

相关阅读

【日本IT】2018日本开发语言收入排名大公开 | 快来看

平均年收入:约36万人民币最大年收入:约96万人民币求人件数:2200件(按汇率为0.06计算)Go:(又称Golang)是Google开发的一种静态强类型、编译

自然语言处理中“中文分词”技术中“自动切分”的几点

概述在人工智能中,自然语言处理是一门极其深奥的领域,自然语言处理在广义上分为两部分,第一部分自然语言理解,是指让电脑“听懂”人类

想当黑客?浅谈C语言编程:不会这个知识就别想了!

浅谈C语言数据结构——链式堆栈 看到标题点进来的朋友,应该对黑客这个名词很敏感吧?我想应该是这样的,但是你们知道作为一名黑客需要

C语言通过socket编程实现TCP通信

服务端客户端通信例子:socket tcp 通信1,socket tcp通信2,udp使用讲解,socket udp通信例子 1.  TCP/IP协议 叫做传输控制/网际协议,又

c语言中的移位运算符

数据在计算机中以补码存储   移位运算符:<<  左移运算符                >>  右移运算符一丶 << 左移运算符     

分享到:

栏目导航

推荐阅读

热门阅读