《C语言解惑》—— 2.6 字符输入要搞特殊化

2.6 字符输入要搞特殊化

在例2.7中的语句
scanf("%d%d%d",&a,&b,&c);
中,只要不在最后留有空格,都不影响数字输入。如果要按格式输入,可以在格式说明中给出,例如在语句
scanf("%d%d%d",&a,&b,&c);
中,要求输入数据用“,”隔开。对于字符而言,语句
scanf("%c%c%c",&c1,&c2,&c3);
则要求三个字符之间不能用空格隔开,但对于语句
scanf("%c %c %c",&c1,&c2,&c3);
而言,既可以连续输入,也可以用空格隔开,即输入
abc
和使用空格隔离的输入
a b c (包括ab c和a bc)
是等效的。最有意义的是:还可以用回车一个一个地输入,即
a
b
c
但是在一行输入时,第1个输入不能留空格,即“ abc”将会得到输出“ a,b”。
试想一想,下面的语句会出现何种现象?
scanf(" %c %c %c",&c1,&c2,&c3);
这个语句非常有意义,它不仅能适应上述4种输入形式,还可以有第5种方式,即可以先按回车,然后再使用4种方式的任意一种输入。下面这个程序将体现它这个非常有用的特点。
【例2.8】分析下面的程序是否正确。

#include <stdio.h>
void main()
{
         char c1;
         for(;;){
             ?printf("继续则输入Y:");
             ?scanf("%c",&c1);
             ?if(c1!='Y') break;
             ?printf("go on\n");
        }
          ?printf("go out\n");
  }

【分析】程序语法没有错误,能通过编译,但运行结果有时正确有时错误,例如:
继续则输入Y:Y
go on
继续则输入Y:go out
第2次询问,不等用户输入就错误地结束循环,输出go out。这就是这两条语句相遇碰到的问题,但利用空格就能解决,即改为
scanf(" %c",&c1);
能得到正确的结果。运行示例如下。
继续则输入Y:Y
go on
继续则输入Y:Y
go on
继续则输入Y:a
go out
由此可见,用空格能很好地解决这个问题。

时间: 2024-09-18 21:23:55

《C语言解惑》—— 2.6 字符输入要搞特殊化的相关文章

《C语言解惑》—— 导读

前 言 C语言编程仍然是编程工作者必备的技能.目前有四类典型的学习C语言的教材:第一类是以讲授语法为主线,即流行的教科书方式,所涉及的例题均以正确的程序为主:第二类是以案例教学为主的教材,摆脱了语法的部分约束:第三类是以讲解编程技术为主的经验之作,主要针对已有编程基础的读者:第四类是针对编程容易产生错误的专题,对比正确与错误的程序以提高编程能力,涉及的内容比较专业.这些教材各有千秋,其共同的目的都是想教会读者如何编写正确.规范的程序.我们也曾在两部教材的每一章中尝试增加一节错误分析的内容,以期让

《C语言解惑》一第1章 操作符1.1 基本算术操作符

第1章 操作符 C语言解惑 C语言程序由语句构成,而语句由表达式构成,表达式又由操作符和操作数构成.C语言中的操作符非常丰富--本书的附录B所给出的操作符汇总表就是最好的证据.正是因为这种丰富性,为操作符确定操作数的规则就成为了我们理解C语言表达式的核心和关键.那些规则--即所谓的"优先级"和"关联性"--汇总在本书附录A的操作符优先级表里.请使用该表格来解答本章中的谜题. 谜题1.1 基本算术操作符 请问,下面这个程序的输出是什么? main() { int x;

《C语言解惑》一导读

前言 C语言解惑 C语言并不大--如果以参考手册的篇幅作为衡量标准的话,C语言甚至可以归为一种"小"语言.不过,这种"小"并不意味着C语言的功能不够强大,而是说明了C语言里的限制性规则比较少.C语言本身的设计非常简洁精妙,这一点相信C语言的使用者早已有所体会. 不过,C语言的这种精妙对C语言的初学者来说,似乎是故作神秘.因为限制较少,C语言可以写成内容丰富的表达式,这可能会被初学者认为是输出错误.C语言的紧凑性允许以简洁凝炼的方式实现常见的编程任务. 学用C语言的过

大S潮女装扮现身机场戴墨镜过安检搞特殊化

大S潮女装扮现身机场 徐熙媛(大S)近日秘密现身上海虹桥机场.大S戴着墨镜,在头等舱登机处排队.助理在办理登机牌,大S站在原地看着行李,还不时摆弄着自己的墨镜.进入机场安检处,大S接受机场的安检扫描,还戴着墨镜搞特殊化.[page] 大S潮女装扮现身机场[page] 大S戴墨镜过安检搞特殊化[page] 大S戴墨镜现身机场

《C语言解惑》一1.4 二进制位操作符

谜题1.4 二进制位操作符 请问,下面这个程序的输出是什么? define PRINT(int) printf(#int " = %d\n", int) main() { int x, y, z; x = 03; y = 02; z = 01; PRINT( x | Y & z ); (1.4.1) PRINT( x | y & ~ z ); (1.4.2) PRINT( x ^ y & ~ z ); (1.4.3) PRINT( x & y &

《C语言解惑》一1.3 逻辑操作符和增量操作符

谜题1.3 逻辑操作符和增量操作符 请问,下面这个程序的输出是什么? define PRINT(int) printf("%d\n",int) main() { int x, y, z; x = 2; y = 1; z = 0; x = x && y || z; PRINT(x); (1.3.1) PRINT( x || ! y && z ); (1.3.2) x = y = 1; z = x ++ - 1; PRINT(x); PRINT(z); (1

《C语言解惑》一1.5 关系操作符和条件操作符

谜题1.5 关系操作符和条件操作符 请问,下面这个程序的输出是什么? define PRINT(int) printf(#int " = %d\n",int) main() { int x=1, y=1, z=1; x += y += z; PRINT( x < y ? y : x ); (1.5.1) PRINT( x < y ? x ++ : y ++ ); PRINT(x); PRINT(y); (1.5.2) PRINT( z += x < y ? x ++

《C语言解惑》一1.6 操作符的优先级和求值顺序

谜题1.6 操作符的优先级和求值顺序 请问,下面这个程序的输出是什么? define PRINT3(x,y,z) \ printf(#x "=%d\t" #y "=%d\t" #z "=%d\n",x,y,z) main() { int x, y, z; x = y = z = 1; ++x || ++y && ++z; PRINT3(x,y,z); (1.6.1) x = y = z = 1; ++x && ++

《C语言解惑》—— 1.2 象形字体扰乱视听

1.2 象形字体扰乱视听 要特别注意形状相近的字母,最典型的是小写字母"l"和数字"1".以下面的程序为例. [例1.1]演示混淆字母"l"和数字"1"的错误程序. #include <stdio.h> void main() { double x=0; printf("输入x:"); scanf("%1f",&x); printf("输出x:%f\n&qu