C++风格string的输入【cin,getline(默认结束标志,自定义结束标志)】

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 Worlds 只会存储 HelloWorld 会留在输入缓冲区。


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 再 getlinecin.ignore()避免 getline 跳过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值