C风格的字符数组(字符串): 类型 数组名[常量值];
1. 输入不含空格的字符串
1)scanf:

输入abcdef
输出abcdef
2)cin

输入abcdef
输出abcdef
2. 输入包含空格的字符串
scanf:
当使用scanf输入字符串时,与占位符%s配合使用。%s:从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。scanf:遇到%s占位符,会在字符串的末尾存储一个\0作为字符串结束的标志。(特点:遇到空格、换行符、制表符会停止读取,并自动在末尾加 \0。)
cin:
使用cin输入字符串时,cin遇到空白字符时,会认为字符串结束,不再继续,同时在已经读取到的字符串末尾加上\0。(特点:同样遇到空格停止读取,并自动加 \0。)
所以上述scanf和cin都不适用于输入包含空格的字符串。
1)fgets:只能用于C风格字符数组(char[])
从第一个字符开始,最多读取num-1个字符,最后一个位置留给\0,如果num的长度远大于输入的字符串长度,就会一直读到\n(换行符)停止并且会读取\n,将\n作为读取到内容的一部分,同时在读取到的内容后自动加上\0。
fgets 的函数原型:
![]()
参数:str:必须是 char[] 或动态分配的 char*。
n:最大读取字符数(包括末尾的 \0)。
stream:输入流(如 stdin)。
fgets(放哪去,最多读多少个字符,从哪里读(一般是从键盘上读:stdin))

将 fgets 的数据存入 std::string(间接方法):先读入 char[],再转 std::string。

2)scanf
占位符:%[^\n]s:一直读取到\n为止,不会将\n读进来,但会在读取到的字符串后加上\0。

3)getchar
一次只读一个字符,即一个一个字符的读取。需要手动添加字符串结束符\0。

4)使用 cin.get() 或 cin.getline()
cin.get() 和 cin.getline() 主要用于字符数组(char[]),而不是 std::string。

总结对比
| 方法 | 是否读取空格 | 是否读取 \n | 是否自动加 \0 | 适用场景 |
|---|---|---|---|---|
scanf("%s") | ❌ 遇到空格停止 | ❌ | ✅ | 无空格输入 |
cin >> str | ❌ 遇到空格停止 | ❌ | ✅ | C++无空格输入 |
fgets | ✅ 读取空格 | ✅ 读取 \n | ✅ | 整行输入(推荐) |
scanf("%[^\n]s") | ✅ 读取空格 | ❌ 不读 \n | ✅ | 整行输入(无 \n) |
getchar | ✅ 逐个字符读 | 可自定义 | ❌ 需手动加 \0 | 精细控制输入 |
1万+

被折叠的 条评论
为什么被折叠?



