连续调用scanf的问题总结
对于非常简单的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", &a,&b);
printf("input c\n");
scanf("%d", &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", &a);
scanf("%c",&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的问题总结的更多相关文章
- paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
paip.java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- php部分--面向对象三大特性-封装(另加连续调用的一个例子)、继承(重写、重载的例子)、多态;
一.封装性: 目的:为了使类更加安全. 做法:1设置私有成员 2在类中建方法,访问私有成员 3在方法里边加控制(if) 私有成员访问的两种方法: 方法一:set(可写) get(可读)做方法(可读可写 ...
- 连续调用inet_ntoa打印出错的问题
近日写程序,在打印信息的时候调用了inet_ntoa函数,出现了打印一直出错的情况.google了一下,是因为inet_ntoa这类函数没有保证线程安全,其实现原理是在静态内容中申请一块内存,每次调用 ...
- 【JavaScript】 模拟JQuery的连续调用函数
连续调用,了解调用主体 var zhangsan = { smoke: function () { console.log("Smoking..."); return this; ...
- C-Scanf连续调用多次并且存在%c的问题
问题现象: 当程序中存在多个scanf时,针对第一个scanf的输入,一般用户会以空白字符(空格.换行.tab.换页符)等结束.但若后面有一个scanf(“%c”,&ch),则刚才输入的空白字 ...
- 在C语言中连续使用scanf()函数出现的问题
#include<stdio.h> int main() { ],*c; printf("input string:\n"); scanf("%c" ...
- WPF Loaded事件连续调用两次的问题
最近开发的一套系统中,在检查开发成员的代码时候,在Loaded事件中加上以下语句: this.Loaded -= new RoutedEventHandler(***_Loaded);这让我觉得有些奇 ...
- 调用scanf函数的一个陷阱
我们在写C程序时,经常使用scanf函数,让用户输入数据,可是有时候会出现一些很奇怪的问题.例如,下面的程序是一个简单的四则运算: #include <stdio.h> int main( ...
- Qt根据汉字生成位图,可连续调用,生成的位图不会有杂点
void MainWindow::drawText(int font_size, QString str, int n){ QPainter p; QSize size(460, font_size) ...
随机推荐
- linux系统——etc下的profile文件
/etc/profile文件 /etc/profile是全局的,适用于所有的shell.在刚登录Linux时,首先启动 /etc/profile 文件. profile文件会告诉shell使用什么语言 ...
- #ifndef 的用法介绍
ifndef是 if not define 的缩写,一种宏定义.它是预处理功能中三种(宏定义,文件包含和条件编译)中的第三种--条件编译. 其使用方式是: #define X ... #endif / ...
- Write with Vim (1)
Write with Vim (1) 本文出自Svitter的blog 原文在之前的也曾发表 大约在一年前使用vim?这个也是个不确定的时间.具体什么时间使用Vim早已经忘记了. 现在用的还算顺手,但 ...
- 【01】npm/cnpm安装
包安装相关信息: 1.node_modules文件夹 node_modules文件夹在nodejs中是一个特殊的文件夹,通过它的名字就可以看出,该文件夹也是用于存放node模块.如果一个模块表达式不是 ...
- 关于Delphi cxGrid主从表中从表只能编辑第一条记录的问题
在Delphi cxGrid主从表中从表只能编辑第一条记录,这个问题是由于设置主从关联字段错误造成的. 从表DBtableView2的keyfieldnames,DetailKeyFieldNames ...
- pat 团体天梯 L1-046. 整除光棍
L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1 ...
- 怎样在SQL2005中设置 自增长类型?
原文发布时间为:2009-04-25 -- 来源于本人的百度文章 [由搬家工具导入] 最近好几个人问我。。。。。 企业管理器-->右键你的表-->设计表-->选中一int类型字段-- ...
- echarts源码中关于 判断平台的有用代码
function detect(ua) { var os = {}; var browser = {}; // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\ ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---46
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- linux 下 多进程与多线程
[Linux]多进程与多线程之间的区别 http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请 ...