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

问题描述

我将首先说我对发布问题以及C ++相对陌生,我的头衔有些la脚,因为它并没有真正专门解决我要处理的问题,但是我不能并没有真正想出另一种措词方式,因此,对改进标题的任何建议都表示赞赏。

我正在开发一个相对简单的函数,该函数应该使用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语句有关,但是我真的错在哪里了,特别是因为它可以工作到第3个换行符。感谢您的帮助

解决方法

该程序的行为是不确定的。将输入读取到std::string中可能会导致其容量增加。这将导致字符串中的指针变为无效。指针,例如inputArray。然后,您稍后尝试读取无效的指针。

P.S。在循环的每次迭代中使用std::strlen计算字符串的长度不是一个好主意。通过使用userInput.size()可以不进行计算就获得尺寸。

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...