技术交流QQ群:1027579432,欢迎你的加入!
1.C语言中输入字符和字符串
- C语言有多个函数可以从键盘获得用户输入,它们分别是:
- scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
- getchar()、getche()、getch():这三个函数都用于输入单个字符。
- gets():获取一行数据,并作为字符串处理。
2.输入单个字符
- 输入单个字符当然可以使用scanf()这个通用的输入函数,对应的格式控制符为%c,。本节重点讲解的是getchar()、getche()和getch()这三个专用的字符输入函数,它们具有某些scanf()没有的特性,是scanf()不能代替的。
2.1 getchar()
- 最容易理解的字符输入函数是getchar(),它就是scanf("%c", c)的替代品,除了更加简洁,没有其它优势了;或者说getchar()就是 scanf()的一个简化版本。
#include "stdio.h" #include "stdlib.h" int main(){ // getchar() char c; c = getchar(); // 可以将上面的两行代码合并,写成 char c=getchar(); printf("c=%c\n", c); return 0; }
2.2 getche()
- getche()就比较有意思了,它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和scanf()、getchar()的最大区别。请看下面的代码:
#include "stdio.h" #include "stdlib.h" #include "conio.h" // getche()需要包含的头文件 int main(){ // getche() char cc = getche(); printf("cc=%c\n", cc); return 0; }
- 输入@后,getche()立即读取完毕,接着继续执行printf()将字符输出,所以没有按下回车键程序就运行结束了。注意:getche()位于 conio.h头文件中,而这个头文件是Windows特有的,Linux和Mac OS下没有包含该头文件。换句话说,getche()并不是标准函数,默认只能在 Windows下使用,不能在Linux和Mac OS下使用。
2.3 getch()
- getch()也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche()相同。getch()的特别之处是它没有回显,看不到输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。
#include "stdio.h" #include "stdlib.h" #include "conio.h" // getche()需要包含的头文件 int main(){ // getch() char ccc = getche(); printf("ccc=%c\n", ccc); return 0; }
- 输入@后,getch()会立即读取完毕,接着继续执行printf()将字符输出。但是由于getch()没有回显,看不到输入的@字符,所以控制台上最终显示的内容为c: @。注意:和getche()一样,getch()也位于conio.h头文件中,也不是标准函数,默认只能在Windows下使用,不能在Linux 和Mac OS下使用。
2.4 三个函数的总结
3.输入字符串
- 输入字符串当然可以使用scanf()这个通用的输入函数,对应的格式控制符为%s;本节重点讲解的是gets()这个专用的字符串输入函数,它拥有一个scanf()不具备的特性。gets()的使用也很简单,请看下面的代码:
#include "stdio.h" #include "stdlib.h" #include "conio.h" // getche()需要包含的头文件 int main(){ // gets() char author[30], lang[30], url[30]; gets(author); printf("author: %s\n", author); gets(lang); printf("lang: %s\n", lang); gets(url); printf("url: %s\n", url); return 0; }
-
gets()是有缓冲区的,每次按下回车键,就代表当前输入结束了,gets()开始从缓冲区中读取内容,这一点和scanf() 是一样的。gets() 和scanf()的主要区别是:gets()能读取含有空格的字符串,而scanf()不能
- scanf()读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
- gets()认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets()来说就是一个完整的字符串。
4.总结
- C语言中常用的从控制台读取数据的函数有五个,它们分别是scanf()、getchar()、getche()、getch()和gets()。其中scanf()、getchar()、gets()是标准函数,适用于所有平台;getche()和getch()不是标准函数,只能用于Windows。
- scanf()是通用的输入函数,它可以读取多种类型的数据;getchar()、getche()和 getch()是专用的字符输入函数,它们在缓冲区和回显方面与 scanf()有着不同的特性,是scanf()不能替代的;
- gets()是专用的字符串输入函数,与scanf()相比,gets()的主要优势是可以读取含有空格的字符串;
- scanf()可以一次性读取多份类型相同或者不同的数据,getchar()、getche()、getch()和gets()每次只能读取一份特定类型的数据,不能一次性读取多份数据。