对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下:

1、多个scanf之后,后序以 scanf("%c",&c)

当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格、enter),比如enter 结束输入;但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束符,就会被输入到a,从而导致了a 为空。

(1)以%d 继续输入的时候:

<PRE>int main(void)
{
int a, b, c = 0;
printf("input a,b\n");
scanf("%d,%d", &amp;a,&amp;b);
printf("input c\n");
scanf("%d", &amp;c);
printf("a = %d, b = %d, c = %d\n", a, b, c);
while (1);
}
input a,b
1,2
input c
3
a = 1, b = 2, c = 3</PRE>

(2)以%c继续输入的时候:

int main(void)
{
int a, b, c = 0;
scanf("%d,%d", &a,&b);
scanf("%c", &c);
printf("a = %d, b = %d, c = %c\n", a, b, c);
while (1);
}

结果:

input a,b
1,2
a = 1, b = 2, c =

结果很神奇,当输入1,2 结束输入:enter之后,就直接是打印出了结果,c压根就没有手动输入就被打印了出来。

原因解释:

输入a,b 值的时候,输入的是: 1,2 enter 。当所以输入的数据里面就有了三个数据,也就是: 1 2 enter,三个数据。当全部都是以 %d 格式作为输入,1赋值给a,2赋值给b,但是enter 很显然不是 %c 格式的,就被 pass 掉,只有当输入的是数字的时候,并将输入的数值3 赋值给 c。

当是以: %d,%d,%c 连续输入的时候,我们知道,输入的是1,2 enter,1赋值a,2赋值给b,而此时,%c,要求的是输入一个字符,就会把 enter 赋值给 c,所以这就造成了 c 打印的结果为空。

scanf 的工作原理:

scanf 的工作原理是将用户的任何输入保存到缓冲区之中,当存在 scanf 的时候,则从缓冲区的队列中读取数据,直到遇见空白字符(空格、enter、tab、换页符)的时候又或者不是本次输入指定类型的时候,就结束这一次的输入。所以,当连续输入为 %d、%f、%x 等数据格式,则可以自动跳过空白字符,因为类型不匹配嘛,直到出现数字位为止;

解决的办法:

(1)通过判断是否输入的为 enter

int main(int argc, char *argv[])
{
int a, b, c = 0;
scanf("%d,%d", &a, &b);
do
{
scanf("%c", &ac);
} while (c == '\n'); printf("a = %d, b = %d, c = %c\n", a, b, c);
while (1);
}

添加了 do while 循环,获得输入为真,也就是获得的输入为enter 或者其他的空白的字符的话,则循环输入,当输入的是要求的数据类型(%c)的时候,就退出循环体,保证可以获得c值。

(2)输入添加空白字符(空格)


<PRE>int main(int argc, char *argv[])
{
int a, b, c = 0;
scanf("%d,%d", &a, &b); scanf(" %c", &c); // %c 前面添加了空格,也就是前面是允许出现空格(enter) printf("a = %d, b = %d, c = %c\n", a, b, c);
while (1);
}</PRE>

其实就是scanf(" %c",&c),多添加了一个空格,。空格%c: 指定了输入的内容是: 空格+%c 的模式。

2、连续多个字符的输入

当需要连续输入多个字符的时候:

<PRE>int main(int argc, char *argv[])
{
char a, b;
scanf("%c", &amp;a);
scanf("%c",&amp;b);
printf("a = %c, b = %c\n", a, b);
while (1);
}</PRE>

结果为:

a
a = a, b =

还是会把 enter 赋值给b,

解决的办法:

(1)添加空格
<PRE>int main(int argc, char *argv[])
{
char a, b;
scanf("%c", &a);
scanf(" %c",&b);
printf("a = %c, b = %c\n", a, b);
while (1);
}

结果输入:

a
b
a = a, b = b

原因不做解释,上面已经做好了解释。

(2)添加 do while 去判断
<PRE>int main(int argc, char *argv[])
{
char a, b;
scanf("%c", &a);
do
{
scanf("%c", &b);
} while ( b == '\n');
printf("a = %c, b = %c\n", a, b);
while (1);
}

连续调用scanf的问题总结的更多相关文章

  1. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型

    paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...

  2. php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;

    一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...

  3. 连续调用inet_ntoa打印出错的问题

    近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...

  4. 【JavaScript】 模拟JQuery的连续调用函数

    连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; ...

  5. C-Scanf连续调用多次并且存在%c的问题

    问题现象: 当程序中存在多个scanf时,针对第一个scanf的输入,一般用户会以空白字符(空格.换行.tab.换页符)等结束.但若后面有一个scanf(“%c”,&ch),则刚才输入的空白字 ...

  6. 在C语言中连续使用scanf()函数出现的问题

    #include<stdio.h> int main() { ],*c; printf("input string:\n"); scanf("%c" ...

  7. WPF Loaded事件连续调用两次的问题

    最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇 ...

  8. 调用scanf函数的一个陷阱

    我们在写C程序时,经常使用scanf函数,让用户输入数据,可是有时候会出现一些很奇怪的问题.例如,下面的程序是一个简单的四则运算: #include <stdio.h> int main( ...

  9. Qt根据汉字生成位图,可连续调用,生成的位图不会有杂点

    void MainWindow::drawText(int font_size, QString str, int n){ QPainter p; QSize size(460, font_size) ...

随机推荐

  1. windows服务-监视文件

    配置一个xml其中有是否开启监视.监视时间.监视路径. FileSystemWatcher watcherName = new FileSystemWatcher(); watcherName.Inc ...

  2. ThreadPool基础之RegisterWaitForSingleObject

    原文发布时间为:2010-10-27 -- 来源于本人的百度文章 [由搬家工具导入] 首先我们看一下它的原型: Codepublic static RegisteredWaitHandle Regis ...

  3. 【自己的练习git】自己的git练习

    liqiang@username MINGW64 ~/Desktop$ mkdir TestGit        新建目录 liqiang@username MINGW64 ~/Desktop$ cd ...

  4. FTK应用程序编程接口(API)手册-1【转】

    转自:http://blog.csdn.net/absurd/article/details/6702047 框架函数 框架函数支撑FTK的主体,它负责初始化应用程序,启动主循环和退出主循环.它对任何 ...

  5. 什麼是 usb upstream port

    主機USB埠是定義為USB纜線的上行端(Upstream)或「A」接頭,即PC端.而裝置USB埠是定義為USB纜線的下行端(Downstream)或「B」接頭,即行動產品端. Reference ht ...

  6. syslog/rsyslog的使用

    syslogd是Linux下的一个记录日志文件服务.从结构来说,可以理解为这个服务下面有一系列的子服务,例如mail.auth.cron.kern等等,这些子服务对外提供日志记录的功能,而当其它的程序 ...

  7. php--获取用户ip

    一般在做登录的时候有的会要求同一个帐号不能同时用不同的ip登录,这个时候我们需要获取到用户IP地址 获取ip地址的函数: function getIP() { if (getenv('HTTP_CLI ...

  8. LeetCode OJ-- LRU Cache ***@

    https://oj.leetcode.com/problems/lru-cache/ 涨姿势的一道题,相当于实现一种数据结构,实现最近最少使用数据结构. // 用来记录 前后节点都是什么 类似链表上 ...

  9. 使用Nginx+FFMPEG搭建HLS直播转码服务器

    目的:使Nginx支持Rtmp协议推流,并支持hls分发功能及FFMPEG转码多码率功能. 一.准备工作 模块:nginx-rtmp-module-master(支持rtmp协议) 下载地址: htt ...

  10. 牛客网 牛客小白月赛1 E.圆与三角形-公式题

    E.圆与三角形   链接:https://www.nowcoder.com/acm/contest/85/E来源:牛客网     这个题把公式推一下, 发现就是1+sinA*r,sinA最大为1,所以 ...