char str;
scanf("%c",&str);
char c=getchar();
printf("c:%c\n", c);
char c=getche();
printf("c: %c\n", c);
解释:输入@后,getche() 立即读取完毕,接着继续执行 printf() 将字符输出,所以没有按下回车键程序就运行结束了。
注意:getche() 位于 conio.h 头文件中。而这个头文件是 Windows 特有的,Linux 和 Mac OS 下没有包含该头文件。但可以系统定义一个函数实现getche()功能。
补充:所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。
回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥
char c=getch();
printf("c:%c\n", c);
解释:输入@后,getch() 会立即读取完毕,接着继续执行 printf() 将字符输出。但是由于 getch() 没有回显,看不到输入的@字符,所以控制台上最终显示的内容为c: @。
注意:和 getche() 一样,getch() 也位于 conio.h 头文件中。这个头文件是 Windows 特有的,Linux 和 Mac OS 下没有包含该头文件。但可以系统定义一个函数实现getche()功能。
scanf函数在给字符数组赋值时,当从键盘输入字符串后,系统会自动在最后添加结束标志‘\0’。
注意:如果输入的字符串中带空格,比如字符串“i like red”。就会出现一个问题。
char str[20];
printf("请输入字符串:");
scanf("%s", str);
printf("输出结果:%s\n", str);
解释:系统将空格作为输入字符串之间的分隔符。也就是说,只要一“敲”空格,系统就认为当前的字符串已经结束,所以只会将空格之前的字符串存储到定义好的字符数组中。
解决办法1:
以空格为分隔符,计算有多少个字符串,有多少个字符串就定义多少个字符数组。比如“i like red”有两个空格,表示有三个字符串,那么就定义三个字符数组。
解决方法2:
使用gets函数
功能:从键盘将带空格的字符序列(以回车键结束)全部输入指定的字符数组,并自动加字符串结束符‘\0’。该函数可以将带空格的字符串全部输入字符数组中。
char str[20];
printf("请输入字符串:");
gets(str);
printf("输出结果:%s\n", str);
char a[20];
char str[20];
printf("请输入文件名:");
scanf("%s",a);
printf("请输入关键字:");
//getchar();
//fflush(stdin);
gets(str);
printf("%s\n",str);
可以看到没等第二次的关键字的输入程序就运行结束了,为什么呢?
解释:当我们输入字符串file后按回车的时候就会把file连同换行符送入缓冲区,然而scanf只会接收字符串file,并把这个字符串送入到以a为首地址的地址空间中,同时在字符串后面自动加上一个‘\0’,那么如今缓冲区内就只有一个换行符了。当执行到gets()函数的时候,因为缓冲区内非空,无法输入字符串。gets直接会读取缓冲区中的换行符复制到str为首地址的内存空间,同时在字符串后面自动加上一个‘\0’,所以输出的str的结果是一个换行。
解决法1:当我们取消程序中注释语句getchar()的时候,getchar()会接收缓冲区中的第一个字符,那么缓冲区便空了。当执行到gets()的时候,由于缓冲区为空,那么程序便会停在gets()位置处的等待输入。
解决法2:也可以使用fflush(stdin)来刷新缓冲区,同样可以起到消除换行符的效果。因为fflush(stdin)的作用是清除标准输入缓冲区中的内容。
注意:某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能。在这些支持fflush(stdin)的编译器中,当输入多个字符串时,特别是一行代码输入一个字符串时,必须在每个输入前加上fflush(stdin)。