技术交流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 三个函数的总结

输入字符函数总结.png

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()每次只能读取一份特定类型的数据,不能一次性读取多份数据。