c++ - 为什么 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 语句有关,但我真的不知道出了什么问题,特别是因为它在第三个换行之前工作正常。任何帮助表示赞赏
解决方案
程序的行为是未定义的。读取输入std::string
可能会导致其容量增加。这会导致指向字符串的指针变得无效。指针,如inputArray
. 然后,您稍后会尝试读取无效指针。
PSstd::strlen
在循环的每次迭代中计算字符串的长度并不是一个好主意。使用 . 可以在不计算的情况下获得大小userInput.size()
。
要解决这两个问题,请不要使用inputArray
. 你不需要它:
for (int i = 0; i < userInput.size(); i++){
if ((userInput[i] == ' ') || (userInput[i] == '\n')){
...
推荐阅读
- reactjs - 该事件在我的 React 项目中有效,但页面保持不变。(使用 Spring Boot)
- java - log4j 属性 BurstFilter 配置
- ios - 定位服务工作,但经纬度根本没有加载
- python - 文本挖掘预处理必须应用于测试还是训练集?
- r - 在 mutate 函数中包含运算符
- wordpress - Elementor Pro 上的响应模式出现问题
- mercurial - 如何在 `hg log --follow FILENAME` 中查看每个提交的文件名?
- python - tk 风格定制保存/存储在哪里?
- delphi - 为什么在 Delphi 中录制的麦克风音频有时会被截断?
- button - 访问主页后,Imacro 必须按下按钮