c++ - 为什么 std::string.size() 在我的代码中表现异常?
问题描述
在这段代码中,当我一一输入输入时,我得到了预期的正确输出(使用正确的字符串大小std::string.size()
),但是当我一起输入三个或四个输入(或批量输入)时输出(字符串的大小)增加 2。
Ps:看一下附加的输出片段。
#include <iostream>
int main()
{
int count;
std::cin >> count;
std::cin.ignore();
while (count--)
{
std::string s;
std::getline(std::cin, s);
std::cout << s.size() << '\n';
}
return (0);
}
编辑:我打印了所有输入的字符串,发现最后,多余的字符是两个空格,如下所示,(虽然我到目前为止尝试过,但仍然不知道原因):
5
</h1>
</h1> 7
Clearly_Invalid
Clearly_Invalid 17
</singlabharat>
</singlabharat> 17
</5>
</5> 6
<//aA>
解决方案
std::cin.ignore();
忽略 EOF 的字符。当您输入一行时,就会遇到EOF。当你输入几行时,不符合EOF,但\n
符合。因此输入 5 之后的下一个 getline 返回空字符串,长度为 0。
当使用空格分隔的输入(例如 int n; std::cin >> n;)时,任何后面的空格,包括换行符,都将留在输入流上。然后,当切换到面向行的输入时,使用 getline 检索到的第一行就是那个空格。如果这是不受欢迎的行为,可能的解决方案包括:
- 对 getline 的显式无关初始调用
- 用 std::cin >> std::ws 删除连续的空格
- 使用 cin.ignore(std::numeric_limitsstd::streamsize::max(), '\n') 忽略输入行上的所有剩余字符
其他行的长度可能会通过\r\n
在中间粘贴 MS 特定文本文件输入转换未处理的文本来增加。
推荐阅读
- angular - 如何在 Angular 库中使用与 ng-packagr 捆绑的资产
- javascript - LitElement 使用 SVG 字符串构建嵌套 SVG 的渲染问题
- azure - 在 Azure 中的 VM 上设置 RabbitMq
- azure - 天蓝色管道多行脚本
- python - 基于索引连接嵌套列表中的字符串
- sharepoint - ExecuteQueryRetry 正在抛出远程服务器返回错误:(401)未经授权
- javascript - 过滤值 sapui5 后忙碌指示器不会停止
- c# - 使用 NLog 仅记录异常的特定属性
- python - 如何从 Python 重新启动 Azure 应用服务插槽?
- c# - 为了共同祖先的空超类