思路
本题考察字符数组的整行输入。
假设我们有一个满足下面定义的字符数组:
C++
const MAX_LEN = 100;
char str[MAX_LEN];
然后希望输入一整行字符串。
太长不看版:
C++
:使用cin.getline(str, MAX_LEN)
。C语言
:使用gets_s(str, MAX_LEN)
。想玩花活的(非必要不建议)
:使用scanf("%[^\n]", str)
或fgets(str, MAX_LEN, stdin)
。
具体的使用细节可以看下面的正文。
正文:
在比较早的C/C++
版本中,经常可以看到推荐使用gets
函数来进行整行字符串的输入,就像下面这样的简单写法即可输入一整行:
C++
gets(str);
但是当输入的字符串长度超过数组长度上限MAX_LEN
时,gets
函数会把超出的部分也一并读进来,并且会覆盖数组之外的内存空间,这就导致了一定的安全风险,因此C++11
标准将gets
函数废弃了,然后在C++14
时将该函数移除,如果现在想要整行输入的话,推荐使用cin.getline
函数(见下文);而在C语言
标准中gets
函数则是在C11
时被移除,与此同时增加了gets_s
函数(见下文),除此之外还有fgets
函数可供选择。
下面对四种整行输入方法进行解释。
cin.getline
:仅C++
可用,C语言
不可用。需要添加#include <iostream>
头文件,并且在头文件后增加一行using namespace std;
。然后我们可以像下面这样使用,其中第一个参数是字符数组,第二个参数是最大允许读入的字符个数,设置为字符数组的长度即可。
C++
cin.getline(str, MAX_LEN);
gets_s
:仅C语言
可用,C++
不可用。用法如下所示,其中第一个参数是字符数组,第二个参数是最大允许读入的字符个数,设置为字符数组的长度即可。
C
gets_s(str, MAX_LEN);
-
scanf("%[^\n]", str)
:C++
和C语言
均可用。原理是使用scanf
的正则表达式输入功能,其中%[^\n]
的含义是 “只要不为\n
,就一直读入”,也就是说它会读入到换行符结束(或者全部读完),即实现了读入整行的效果。关于正则表达式的内容留给有兴趣的同学了解,这里就不展开了。需要注意,这种方式不会把碰到的换行符处理掉,导致连续输入多行字符串的时候还要自己动手处理换行符,并不是很方便(可以参考 字符串输入输出II