我建议将该行读入一个字符串,然后根据空格将其拆分。为此,您可以使用getline(...)函数。诀窍是拥有一个动态大小的数据结构来保存拆分后的字符串。可能最容易使用的是vector。
#include <string>
#include <vector>
...
string rawInput;
vector<String> numbers;
while( getline( cin, rawInput, ' ' ) )
{
numbers.push_back(rawInput);
}
所以说输入看起来像这样:
Enter a number, or numbers separated by a space, between 1 and 1000.
10 5 20 1 200 7
您现在将拥有一个向量 numbers,其中包含以下元素:{"10","5","20","1","200","7"}。
请注意,这些仍然是字符串,因此在算术中没有用。要将它们转换为整数,我们使用 STL 函数 atoi(...) 的组合,并且因为 atoi 需要 c 字符串而不是 c++ 样式字符串,我们使用字符串类的c_str()成员函数。
while(!numbers.empty())
{
string temp = numbers.pop_back();//removes the last element from the string
num = atoi( temp.c_str() ); //re-used your 'num' variable from your code
...//do stuff
}
现在这段代码有一些问题。是的,它可以运行,但它有点笨拙,而且它以相反的顺序排列数字。让我们重新编写它,使其更紧凑:
#include <string>
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
{
num = atoi( rawInput.c_str() );
...//do your stuff
}
错误处理还有很大的改进空间(现在如果你输入一个非数字,程序就会崩溃),并且有无限多的方法来实际处理输入以使其成为可用的数字形式(编程的乐趣! ),但这应该给你一个全面的开始。:)
注意:我有参考页面作为链接,但我不能发布超过两个,因为我的帖子少于 15 个:/
编辑:我对 atoi 行为有点错误;我将它与 Java 的 string->Integer 转换混淆了,当给定一个不是数字的字符串时,它会抛出一个 Not-A-Number 异常,如果不处理异常,程序就会崩溃。另一方面,atoi() 返回 0,这没有帮助,因为如果 0 是他们输入的数字怎么办?让我们使用isdigit(...)函数。这里要注意的重要一点是,可以像数组一样访问 c++ 样式的字符串,这意味着 rawInput[0] 是字符串中的第一个字符,一直到 rawInput[length - 1]。
#include <string>
#include <ctype.h>
...
string rawInput;
cout << "Enter a number, or numbers separated by a space, between 1 and 1000." << endl;
while( getline( cin, rawInput, ' ') )
{
bool isNum = true;
for(int i = 0; i < rawInput.length() && isNum; ++i)
{
isNum = isdigit( rawInput[i]);
}
if(isNum)
{
num = atoi( rawInput.c_str() );
...//do your stuff
}
else
cout << rawInput << " is not a number!" << endl;
}
布尔值(分别为 true/false 或 1/0)用作 for 循环的标志,它遍历字符串中的每个字符并检查它是否为 0-9 数字。如果字符串中的任何字符不是数字,则循环将在下一次执行期间达到条件“&& isNum”时中断(假设您已经覆盖了循环)。然后在循环之后, isNum 用于确定是做你的事情,还是打印错误信息。