【问题标题】:Reading line of integers into a vector将整数行读入向量
【发布时间】:2012-09-28 08:40:00
【问题描述】:

请看下面的代码

int main()
{
    cout << "Enter numbers (-1 to stop entering; -2 to exit)" << endl;

    while(cin>>enterNumber)
    {
     numbers.push_back(enterNumber);
    }


    for(size_t size=0;size<numbers.size();size++)
    {
        cout << numbers[size] << endl;
    }
}

我在这里尝试做的是这样的

  1. 输入数字列表(例如:1 2 3 4 5 6 7 8 9 0 11)
  2. 将它们全部读入向量中
  3. 打印出来

在这里,当我按下回车键时,什么都没有发生!似乎循环没有退出。当我按下回车键时如何打印值?

更新

我按照答案中的建议编辑了代码。

int main()
{
    cout << "Enter numbers (-1 to stop entering; -2 to exit)" << endl;

    std::string line;
getline(std::cin, line);
std::istringstream iss(line);
while (iss >> enterNumber)
{
    numbers.push_back(enterNumber);
}


    for(size_t size=0;size<numbers.size();size++)
    {
        cout << numbers[size] << endl;
    }
}

但它现在给出了另一个错误

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory `/cygdrive/c/Users/yohan/Documents/NetBeansProjects/Excersice 6'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin-Windows/excersice_6.exe
make[2]: Entering directory `/cygdrive/c/Users/yohan/Documents/NetBeansProjects/Excersice 6'
mkdir -p build/Debug/Cygwin-Windows
rm -f build/Debug/Cygwin-Windows/Multiple.o.d
g++    -c -g -MMD -MP -MF build/Debug/Cygwin-Windows/Multiple.o.d -o build/Debug/Cygwin-Windows/Multiple.o Multiple.cpp
Multiple.cpp: In function `int main()':
Multiple.cpp:22: error: variable `std::istringstream iss' has initializer but incomplete type
Multiple.cpp:60:3: warning: no newline at end of file
make[2]: *** [build/Debug/Cygwin-Windows/Multiple.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
nbproject/Makefile-Debug.mk:78: recipe for target `build/Debug/Cygwin-Windows/Multiple.o' failed
make[2]: Leaving directory `/cygdrive/c/Users/yohan/Documents/NetBeansProjects/Excersice 6'
nbproject/Makefile-Debug.mk:61: recipe for target `.build-conf' failed
make[1]: Leaving directory `/cygdrive/c/Users/yohan/Documents/NetBeansProjects/Excersice 6'
nbproject/Makefile-impl.mk:39: recipe for target `.build-impl' failed


BUILD FAILED (exit value 2, total time: 1s)

【问题讨论】:

  • Enter 只是更多的空格。输入 EOF 或无效的内容。更好的是,如果您已经这样做了,请使用 std::copy 将输入复制到向量。合并您的特殊输入将需要更多的工作,而不仅仅是 while (cin&gt;&gt;...)

标签: c++ vector while-loop std


【解决方案1】:

使用getline 将一行从cin 读入字符串。然后将该字符串放入istringstream。然后从 istringstream 中读取,而不是您现在使用的 cin

std::string line;
getline(std::cin, line);
std::istringstream iss(line);
while (iss >> enterNumber)
{
    numbers.push_back(enterNumber);
}

【讨论】:

  • @Sepala: #include &lt;sstream&gt;
  • 额外的小问题。 C++ 会自动转换类型吗?那为什么会有 static_cast 之类的转换方法呢?
  • iss &gt;&gt; enterNumber 返回什么?为什么我们可以用它作为while循环的条件?
  • @AnnaVopureta:它返回对流的引用(在本例中为iss)。由于issistringstream 类型的对象,它派生自basic_ios,所以它有一个转换为bool 的运算符(en.cppreference.com/w/cpp/io/basic_ios/operator_bool)。只要iss 处于良好状态,此运算符就会返回true,如果读取操作因任何原因失败,则不会返回true。所以条件基本上是,“只要我们成功地从流中读取”。
  • 我理解直觉,我只是不明白它为什么会起作用(为什么当读取操作失败时布尔值变为假,否则为真)。 while 循环中表达式的返回类型是 >> 运算符返回的内容,对吗?如果你去查找 isstream >> 运算符的文档,你会看到它在读取成功时返回 false,否则它返回一个非零值(映射为布尔值 true)。这与我们需要的相反,但代码有效。我错过了什么?
猜你喜欢
  • 2019-05-11
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多