首页 > 解决方案 > 为什么 getline 在 3 个换行符之后表现异常?

问题描述

我会先说我对发布问题以及一般的 C++ 比较陌生,我的标题有点蹩脚,因为它并没有真正具体解决我正在处理的问题,但是我真的不能想出另一种说法,所以任何关于改进标题的建议都值得赞赏。

我正在研究一个相对简单的函数,它应该使用 getline 获取一个字符串,并读取字符串中的空格和/或换行符,以便它可以输出输入了多少个单词。到达字符“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

该函数工作得很好,并像我期望的那样返回 3。但如果我进入

hello
jim
tim
bill
q

计数变为 0。我假设这与我的 if 语句有关,但我真的不知道出了什么问题,特别是因为它在第三个换行之前工作正常。任何帮助表示赞赏

标签: c++user-inputstdgetline

解决方案


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

PSstd::strlen在循环的每次迭代中计算字符串的长度并不是一个好主意。使用 . 可以在不计算的情况下获得大小userInput.size()

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

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

推荐阅读