为什么 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')){
...
首先我会说我对发布问题以及一般的 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')){
...