为什么 getline 在 3 个换行符之后表现怪异?

Why does getline behave weirdly after 3 newlines?

首先我会说我对发布问题以及一般的 C++ 比较陌生,我的标题有点蹩脚,因为它并没有真正具体地解决我正在处理的问题,但是我真的想不出另一种方式来表达它,所以任何关于改进标题的建议都将不胜感激。

我正在开发一个相对简单的函数,它应该使用 getline 获取字符串,并读取字符串中的空格 and/or 换行符,以便它可以输出输入了多少个单词。到达字符 'q' 后,基本上应该停止读取字符。

void ReadStdIn2() {
    
    std::string userInput;
    const char *inputArray = userInput.c_str();
    int count = 0;
    
    getline(std::cin, userInput, 'q');
        
        for (int i = 0; i < strlen(inputArray); i++){
            if ((inputArray[i] == ' ') || (inputArray[i] == '\n')){
                count += 1;
            }
        }   
        
        
    std::cout << count << std::endl;
    
}

我希望能够输入多个单词,然后是换行符,并且能够准确显示我的单词数。我不知道为什么,但出于某种原因,在输入 3 个换行符后,我的计数又回到了 0。

例如,如果我输入:

hello
jim
tim
q

该功能运行良好,returns 3 就像我期望的那样。但是如果我输入

hello
jim
tim
bill
q

计数正确到 0。我假设这与我的 if 语句有关,但我真的不知道哪里出了问题,特别是因为它在第三个换行符之前工作正常。感谢任何帮助

程序的行为未定义。将输入读入 std::string 可能会导致其容量增加。这会导致指向字符串的指针变得无效。 inputArray等指针。然后您稍后尝试读取无效指针。

P.S。在循环的每次迭代中用 std::strlen 计算字符串的长度不是一个好主意。使用userInput.size().

可以不用计算得到大小

要解决这两个问题,只需不要使用 inputArray。你不需要它:

for (int i = 0; i < userInput.size(); i++){
    if ((userInput[i] == ' ') || (userInput[i] == '\n')){
        ...