标签:
对于非常简单的scanf函数,一直使用,但是却是有很多的知识点没有掌握好,现总结如下:
当程序连续调用scanf 函数的,前面的获得输入接收的时候,一般结束都是以一个空白字符(空格、enter),比如enter 结束输入;但是,当后面接着是还有一个以 scanf("%c",&a) 的时候,则上面输出 enter 作为结束符,就会被输入到a,从而导致了a 为空。
<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>
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 的时候,则从缓冲区的队列中读取数据,直到遇见空白字符(空格、enter、tab、换页符)的时候又或者不是本次输入指定类型的时候,就结束这一次的输入。所以,当连续输入为 %d、%f、%x 等数据格式,则可以自动跳过空白字符,因为类型不匹配嘛,直到出现数字位为止;
解决的办法:
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值。
<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 的模式。
当需要连续输入多个字符的时候:
<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,
<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
原因不做解释,上面已经做好了解释。
<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); }
标签:
原文地址:http://www.cnblogs.com/qxj511/p/5218279.html