C++风格的字符数组(字符串): string 变量名;
std::string
如何存储字符串?std::string
内部通常存储为:
一个字符数组(动态分配的 char[]
)。
一个长度变量(size()
),用于记录有效字符的数量。
不依赖 '\0'
来判断字符串结束(但某些实现可能在底层额外存储 '\0'
以兼容 C 风格字符串)。
字符串:"hello world"
在C风格字符串(即字符数组)的形式存储,那么它以 空字符
'\0'
作为结束标志。strlen(str)
等C字符串函数依赖'\0'
来判断字符串的结束。
在C++风格字符串(即
std::string
) 不需要显式的结束标志,因为std::string
内部会自行管理长度。字符串"hello world"不再以\0作为结束的标志。
1.输入不含空格的字符串
cin:
使用cin输入字符串时,cin遇到空白字符时,会认为字符串结束,不再继续。std::cin
不会 在 std::string
存储的字符串末尾自动添加 '\0'
(空字符),因为 std::string
是一个高级的字符串类,它内部使用动态数组存储字符,自己管理长度和存储,,并记录长度(str.size()
)。不需要依赖 '\0'
来标记字符串的结束。
如果输入 Hello World
,s
只会存储 Hello
,World
会留在输入缓冲区。
2. 输入包含空格的字符串
getline:
1)getline以换行符"\n"作为字符串结束的标志。
std::getline(输入流, 字符串变量);
第 1 个参数:是一个输入流对象(如 std::cin
、文件流 std::ifstream
等)。
第 2 个参数:是一个 std::string
变量,用于存储读取的内容。
功能:它会从指定的输入流中读取整行(包括空格),直到遇到换行符 '\n'
(但不会存储 '\n'
),同样不会 在 std::string
末尾添加 '\0'
。然后将读取的内容存入 std::string
。
解读以上代码:getline函数从输入流(eg:cin) 中读取文本,直到遇到换行符'\n'为止,然后将读取到的文本(不包括换行符)存储到指定的string类型的变量s中去。
注意:如果之前有 std::cin
输入,可能会残留 \n
,导致 getline
直接读取空行。这时需要先清空缓冲区
2)getline允许用户自定义结束标志。
std::getline(istream& is, string& str, char delim);
is
:输入流(如 std::cin
或文件流)。
str
:存储读取内容的字符串。
delim
:自定义的结束字符(默认是 '\n'
)。
默认行为(以
'\n'
结束):如果不指定第三个参数,std::getline
会读取输入,直到遇到换行符'\n'
(但不会存储'\n'
):
输入:hello world[回车]
结果:line的内容是“hello world”(不包含'\n',结束符 \n 会被从流中移除,但不存储到 line)
自定义结束标志:通过传递第三个参数,可以指定其他字符作为结束标志(读取指定符号之前的内容)
eg:以逗号
,
结束
输入:Hello,World
结果: 读取的内容:Hello(逗号之前的部分)
遇到第一个
,
时停止读取,data
的内容是"Hello"
。剩余的"World"
仍留在输入流中。逗号
,
的下落:不会被存储到
str
中(str
只包含"hello"
)。从输入流中消耗掉(即被“吃掉”,不再留在缓冲区里)。
特殊情况:输入流中未遇到分隔符
如果输入流中没有指定的分隔符(例如输入 "helloworld"
但指定分隔符为 ,
):
getline
会读取整个输入(直到默认的 '\n'
)。
分隔符(,
)自然不存在,因此不会被处理。
总结
输入方式 | 适用场景 | 函数 | 备注 |
---|---|---|---|
不含空格 | 单个单词 | std::cin >> str | 遇到空格停止 |
含空格 | 整行输入 | std::getline(std::cin, str) | 读取到 \n |
混合输入 | 先 cin 再 getline | cin.ignore() | 避免 getline 跳过 |