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 | 精细控制输入 |