首页 > 解决方案 > 为什么 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>

标签: c++size

解决方案


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 特定文本文件输入转换未处理的文本来增加。


推荐阅读