第二十三课:字符、字符串的输入

复习:按字母表的顺序和逆序每隔一个字母打印(小写字母)

#include 
int main()
{
    char letter;
    for(letter='a';letter<='z';letter=letter+2)
    {
        printf("%c ",letter);
    }
    printf("\n");
    for(letter='z';letter>='a';letter=letter-2)
    {
        printf("%c ",letter);
    }
    return 0;
}

一、C语言中的字符串

字符串:由零个或多个字符组成且通过双引号括起来的有限序列就叫做字符串。
在C语言中没有字符串类型,故我们用字符数组来处理字符串。
二、字符数组的定义
因为字符数组是存放字符的数组,故其与数组定义类似。其定义一般为:
char a[10];
表示定义了10个字节的连续内存空间。
三、字符数组的初始化
我们使用字符串来初始化化字符数组。
char a[20]={"Hello World!"};1
字符数组的末尾会自动赋’\0’。数组指定长度后,后面没赋值的元素自动补’\0’
'\0’就是转义的数字0,本质上与数字0相同
如下赋值也是可以的:
char a[]={"Hello World!"};
char a[]="Hello World!";
四、C语言字符及其字符串输入函数。
C语言有多个函数可以从键盘获得用户输入,它们分别是:

  • scanf():和 printf() 类似,scanf() 可以输入多种类型的数据。
  • getchar()、getche()、getch():这三个函数都用于输入单个字符。
  • gets():获取一行数据,并作为字符串处理。

scanf() 是最灵活、最复杂、最常用的输入函数,上节我们已经进行了讲解,本节接着讲解剩下的函数,也就是字符输入函数和字符串输入函数。

输入单个字符

输入单个字符当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%c,上节已经讲到了。本节我们重点讲解的是 getchar()、getche() 和 getch() 这三个专用的字符输入函数,它们具有某些 scanf() 没有的特性,是 scanf() 不能代替的。

1) getchar()

最容易理解的字符输入函数是 getchar(),它就是scanf("%c", c)的替代品,除了更加简洁,没有其它优势了;或者说,getchar() 就是 scanf() 的一个简化版本。

下面的代码演示了 getchar() 的用法:

1.  #include 
2.  int main()
3.  {
4.  char c;
5.  c = getchar();
6.  printf("c: %c\n", c);
7.  return 0;
9.  }

输入示例:

@↙
c: @

你也可以将第 4、5 行的语句合并为一个,从而写作:

char c = getchar();

2) getche()

getche() 就比较有意思了,它没有缓冲区,输入一个字符后会立即读取,不用等待用户按下回车键,这是它和 scanf()、getchar() 的最大区别。请看下面的代码:

1.  #include 
2.  #include 
3.  int main()
4.  {
5.  char c = getche();
6.  printf("c: %c\n", c);
7.  return 0;
8.  }

输入示例:

@c: @

输入@后,getche() 立即读取完毕,接着继续执行 printf() 将字符输出,所以没有按下回车键程序就运行结束了。

3) getch()

getch() 也没有缓冲区,输入一个字符后会立即读取,不用按下回车键,这一点和 getche() 相同。getch() 的特别之处是它没有回显,看不到输入的字符。所谓回显,就是在控制台上显示出用户输入的字符;没有回显,就不会显示用户输入的字符,就好像根本没有输入一样。
回显在大部分情况下是有必要的,它能够与用户及时交互,让用户清楚地看到自己输入的内容。但在某些特殊情况下,我们却不希望有回显,例如输入密码,有回显是非常危险的,容易被偷窥。
getch() 使用举例:

1.  #include 
2.  #include 
3.  int main()
4.  {
5.  char c = getch();
6.  printf("c: %c\n", c);
7.  return 0;
8.  }

输入@后,getch() 会立即读取完毕,接着继续执行 printf() 将字符输出。但是由于 getch() 没有回显,看不到输入的@字符,所以控制台上最终显示的内容为c: @
注意,和 getche() 一样,getch() 也位于 conio.h 头文件中,也不是标准函数,默认只能在 Windows 下使用,不能在 Linux 和 Mac OS 下使用。

对三个函数的总结

微信截图_20191213213227.png

输入字符串

输入字符串当然可以使用 scanf() 这个通用的输入函数,对应的格式控制符为%s,上节已经讲到了;本节我们重点讲解的是 gets() 这个专用的字符串输入函数,它拥有一个 scanf() 不具备的特性。
gets() 的使用也很简单,请看下面的代码:

1.  #include 
2.  int main()
3.  {
4.  char author[30], lang[30], url[30];
5.  gets(author);
6.  printf("author: %s\n", author);
7.  gets(lang);
8.  printf("lang: %s\n", lang);
9.  gets(url);
10.  printf("url: %s\n", url);

12.  return 0;
13.  }

运行结果:

YanChangSheng↙
author: YanChangSheng
C-Language↙
lang: C-Language
http://c.biancheng.net http://biancheng.net↙
url: http://c.biancheng.net http://biancheng.net

gets() 是有缓冲区的,每次按下回车键,就代表当前输入结束了,gets() 开始从缓冲区中读取内容,这一点和 scanf() 是一样的。gets() 和 scanf() 的主要区别是:

  • scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
  • gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。

也就是说,gets() 能读取含有空格的字符串,而 scanf() 不能。

总结

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

你可能感兴趣的:(第二十三课:字符、字符串的输入)