如何在最后输入一个非数字值后退出while cin循环?

问题描述 投票:0回答:1

这段代码在按下 "Enter "键时,将多个ints放入一个向量中,输出显示了向量中的所有元素,每个元素用逗号分隔。输出显示了向量中的所有元素;每个元素用逗号分隔。问题是 "Enter "键并没有退出这个程序。循环 当我在最后输入一个字母或空格时,例如。

输入: 4 55 6 2 1g 4 55 6 2 1g / 在这里按回车键将使其进入下一行,而不会中断while-loop。

正常情况下是如何工作的。

输入: 4 55g 6 2 1 / 如果我在这里按回车键,它会忽略 "g",并打印出矢量中的数字元素,用逗号隔开,这是我想要的,但如果 "g "在最后,就不会发生这种情况。

产出:4、55、6、2、1 4, 55, 6, 2, 1

问题只出现在我在最后输入一个非数字输入时,而不是在元素之间。在结尾处按空格键也会导致这个问题。

int main() {

vector<int> myv;
int value = 0;

while (cin >> value){
    myv.push_back(value);
    if (cin.get() == '\n'){
        break;
    }
}

auto iter = myv.begin();
    while(true){
        cout << *iter;
        ++iter;
        if(iter == myv.end()){
            break;
        }
        else{
            cout << ", ";
        }
    }
}
c++ loops while-loop cin
1个回答
0
投票

你最大的问题是 - 你在按回车键之前输入的字母仍然在流中。所以你的 std::cin.get() 检查不会识别回车键,而是识别字母。 - 在检查之前,你推回了你的向量。这些字母'g'将进入你的向量。

这段代码比较复杂,由于似乎是想在一行输入所有的数据,事后再处理。所以我只是用 std::getline() 并在函数中处理该总输入 break_up(). 此时,我有一个字符串的向量,包含了所有被输入的独立块,有效或无效。

最后,检查各块的有效性。一旦发现有不能完全转换为整数的分块。myv 停止接收数据。然后就打印出来了。我把你的while循环换成了一个更短的for循环。

如果每条数据都单独输入,边走边检查,那么这个程序就会变得简单得多。最难的断行的那点就不存在了,你可以边走边检查,遇到不好的数据就准确地停止,而不是输入了一大堆数据,却发现有80%的数据没有被添加。

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> break_up(std::string line) {
  std::vector<std::string> chunks;

  // Emtpy line check
  if (line.length()) {
    std::string::size_type loc = 0;
    std::string::size_type subStart = 0;
    while (loc != std::string::npos) {
      loc = line.find_first_of(" \t\r\n", loc + 1);
      loc != std::string::npos
          ? chunks.push_back(line.substr(subStart, loc - subStart))
          : chunks.push_back(line.substr(subStart));  // catches last item
      subStart = loc + 1;
    }
  }

  return chunks;
}

int main() {
  std::vector<int> myv;
  std::string values;  // Changed type

  std::getline(std::cin, values);
  std::vector<std::string> chunks = break_up(values);

  for (auto i : chunks) {
    // std::size_t pos;
    try {
      int num = std::stoi(i); // , &pos);
      // if (pos == i.length()) {
        myv.push_back(num);
      // } else {
      //   break;  // Remove this else block to add all valid numbers that
      // }         // were entered
    } catch (...) {
    }  // std::stoi throws two exceptions, don't need to
       // distinguish or take any action. Just don't want the program ending
  }

  // Replaced unnecessarily complicated while loop
  for (unsigned int i = 0; i < myv.size(); ++i) {
    std::cout << myv[i];
    if (i < myv.size() - 1) {
      std::cout << ", ";
    }
  }
  std::cout << '\n';
}

EDIT: 我对代码做了一些细微的修改,以消除对所需输出的误解。我没有对旧代码进行注释。

© www.soinside.com 2019 - 2024. All rights reserved.