对于非常简单的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);
}

最新文章

  1. C#版 Winform界面 Socket编程 Client客户端
  2. 关于IDW空间插值
  3. 利用Canvas编辑图片
  4. Js中this用法及注意点详解
  5. Android启动组件的三种主流及若干非主流方式
  6. 【UVA】11732 - strcmp() Anyone?
  7. web字体格式及几种在线格式转换工具介绍
  8. struts1 logic:iterate bean:write标签使用
  9. 主题模型 利用gibbslda做数据集主题抽样
  10. 从零开始学Axure原型设计(进阶篇)
  11. div,css命名规范!
  12. What can university bring to you?
  13. Kafka--消息队列
  14. 渗透测试学习 三、Linux基础
  15. Spring-Cloud-Gateway 从升级到放弃
  16. main 团队项目厨娘:用例图、类图、时序图
  17. 关于Nginx+Gunicorn+uwsgi+后端框架到app架构梳理和思考
  18. 02: git分支管理
  19. Android Mokoid Open Source Project hacking
  20. QT中QToolTip样式设置的两种方式

热门文章

  1. 【01】iconfont的使用
  2. PowerDesigner反向生成数据库模型(MySql篇)
  3. NOIP2015提高组T2 洛谷P2661 信息传递
  4. 洛谷P2168 荷马史诗
  5. 怎样在SQL2005中设置 自增长类型?
  6. 实现多线程sokect
  7. 00.mp4v2工具的用法
  8. ubuntu下使用OBS开斗鱼直播
  9. Day 32 process&amp;threading_4
  10. java获取整数的各位数值