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

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

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

  1. C语言scanf函数用法详细解释!!!

    函数名: scanf  功 能: 执行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  2. C语言scanf函数用法详细解释!

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备( ...

  3. c语言scanf函数用法完全攻略,C语言scanf函数用法完全攻略

    本节介绍输入函数 scanf 的用法.scanf 和 printf 一样,非常重要,而且用得非常多,所以一定要掌握. 概述 scanf 的功能用一句话来概括就是"通过键盘给程序中的变量赋值& ...

  4. C语言scanf函数详细解释,[转载]C语言printf和scanf函数详细用法

    Printf和Scan函数的使用方法 一 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出 信息.在编写程序时经常会用到此函数.printf()函数的调用格式为: prin ...

  5. scanf 接收 空格 输入_你需要知道的scanf函数用法

    scanf函数   上一节中我们讨论了,如何将整数,浮点数,字符串打印到屏幕上去.既然有输出,怎么能没有输入呢?这一节中,我们来介绍与printf相反的scanf函数.   scanf的功能是将键盘输 ...

  6. C语言中scanf函数用法详解

    scanf 的功能用一句话来概括就是"通过键盘给程序中的变量赋值".该函数的原型为: # include <stdio.h> int scanf(const char ...

  7. scanf函数输入字符串,C语言scanf函数输入字符串详解

    除了在定义字符数组时初始化外,还可以通过scanf从键盘输入字符串.下面写一个程序: # include <stdio.h> int main(void) { char str[10]; ...

  8. linux进程snprintf函数功能,linux 之 snprintf函数用法

    int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...); 函数说明:最多从源串中拷贝n-1个字符到 ...

  9. matlab stem函数坐标轴_MATLAB中stem函数用法

    stem(Y) 将数据序列Y从x轴到数据值按照茎状形式画出,以圆圈终止.如果Y是一个矩阵,则将其每一列按照分隔方式画出. stem(X,Y)在X的指定点处画出数据序列Y.  stem(...,'fil ...

最新文章

  1. c语言变量值与数组元素值交换,编写一个交换变量值的函数,利用该函数交换数组a和数组b中的对应元素值。要求尽量用指针的方法实现。数组a...
  2. Gitlab CI 持续集成的完整实践
  3. 马云马化腾李彦宏在IT峰会上的话-内容提炼
  4. 在北京植物园吸烟将被机器人劝阻
  5. 【LDA学习系列】M-H采样python代码
  6. Train Problem I(模拟栈)
  7. 软件工程师的十个“不职业”行为
  8. 素数路(prime)
  9. 韩顺平php视频笔记49 函数深入 php的值传递与引用传递 goto
  10. TCPIP协议卷2之io中断
  11. mysql 5.5 编译参数_mysql5.5编译安装
  12. 狂神说ElasitcSearch笔记(一)
  13. windows下python3安装pip方法详解
  14. 【Python】使用Python批量移动文件
  15. 动图图解!既然IP层会分片,为什么TCP层也还要分段?
  16. vue.js动态设置VueComponent高度遇到的问题
  17. Aseprite入门教程
  18. 在tableau server 上自定义报表
  19. 2022年最新江西机动车签字授权人模拟试题及答案
  20. ghost系统无法启动

热门文章

  1. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)
  2. linux的cp指令
  3. H.265/HEVC学习笔记:变换
  4. 计划的主体部分应有哪些内容_计划的正文主体一般有哪三个部分构成
  5. python 笔记 将一个log文件转换成excel提取数据保存
  6. 云原生docker容器创建实操
  7. Java多线程模式(一)
  8. 什么是事务(对事物的简单介绍)
  9. 【STC15单片机】动态数码管
  10. 2020.10.3--PS--模糊工具、减淡工具、橡皮擦工具