读取以空格分隔的输入数字

Posted

技术标签:

【中文标题】读取以空格分隔的输入数字【英文标题】:Read input numbers separated by spaces 【发布时间】:2012-10-17 07:07:55 【问题描述】:

这可能是一个初学者的问题,但我还没有找到适合我的答案。

目前,我正在为一个接收用户输入(可以是一个或多个用空格分隔的数字)的类编写程序,然后确定该数字是质数、完美数还是两者都不是。如果数字是完美的,那么它将显示除数。

到目前为止,我已经编写了素数、完美数和除数列表的代码。我被困在程序的输入部分。我不知道如何让用空格分隔的输入一次通过我的循环。

这是我当前的程序:

cout<<"Enter a number, or numbers separated by a space, between 1 and 1000."<<endl;
cin>>num;

while (divisor<=num)
    if(num%divisor==0)
    
        cout<<divisor<<endl;
        total=total+divisor;
        divisor++;
    
    else divisor++;
if(total==num*2)
    cout<<"The number you entered is perfect!"<<endl;
else cout<<"The number you entered is not perfect!"<<endl;


if(num==2||num==3||num==5||num==7)
    cout<<"The number you entered is prime!"<<endl;

else if(num%2==0||num%3==0||num%5==0||num%7==0)
    cout<<"The number you entered is not prime!"<<endl;
else cout<<"The number you entered is prime!"<<endl;

return 0;

它有效,但仅适用于单个数字。如果有人可以帮助我让它能够读取由空格分隔的多个输入,将不胜感激。另外,顺便说一句,我不知道要输入多少个数字,所以我不能只为每个数字做一个变量。这将是一个随机数量的数字。

谢谢!

【问题讨论】:

见SO: Reading a Line of Integers Into Vector 【参考方案1】:

默认情况下,cin 从输入中读取并丢弃所有空格。因此,您所要做的就是使用 do while 循环多次读取输入:

do 
   cout<<"Enter a number, or numbers separated by a space, between 1 and 1000."<<endl;
   cin >> num;

   // reset your variables

   // your function stuff (calculations)

while (true); // or some condition

【讨论】:

每个cin 都会尝试从输入中读取一个数字。所以,是的,它会读取下一个数字,如您在此示例中所见:ideone.com/ZHvdVx 现在我的编程工作正常并显示了所有数字,格式是个问题。例如:“你输入的数字是 6。1 2 3 6 6 完美!”我希望“6 在下一行是完美的。所以,当它在以不同的数字开始新循环之前到达最后一个数字时,有没有办法让它改变到不同的行? 是的,有。每当你想要换行时,你可以cout 一个'\n' 感谢你们的帮助,伙计们!我只需要弄清楚如何制作它,因此每行最多只能显示 7 个数字。你们是最棒的! ^_^ 如果用户愿意的话,我一直在试图弄清楚如何让程序再次循环。我问他们是否想再次运行该程序,但我无法让它从头开始循环。有什么想法吗?【参考方案2】:

我建议将该行读入一个字符串,然后根据空格将其拆分。为此,您可以使用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++ 样式字符串,我们使用 string 类的 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 用于确定是做你的事情,还是打印错误信息。

【讨论】:

哇。哈,你应该是我的教授。感谢你的帮助!学习新的做事方法总是很棒的!在旁注中,我将输入代码,说明如果他们输入任何不是 intiger 的内容,它将询问他们是否要再次尝试该程序。这个类很简单,所以我不需要做最奢侈的编程,但我想知道怎么做,并把它放在我的银行(头脑)中,当我想炫耀一下时。 ;] 非常感谢您的帮助! @RaymondAaron:没问题!我将编辑帖子以包含您的其他问题,因为 cmets 中的格式相当有限。【参考方案3】:

你会想要:

从控制台读取整行 标记线,沿空格分开。 将这些拆分的部分放入数组或列表中 遍历该数组/列表,执行主要/完美/等测试。

到目前为止,您的课程涵盖了哪些内容?

【讨论】:

奇怪的是,什么都没有。我不明白我们应该怎么做。我正在查看我们文本中的数组,但我还没有完全弄清楚它是否可以在我的程序中工作。我想我只是不知道如何正确地做到这一点。【参考方案4】:
int main() 
int sum = 0;
cout << "enter number" << endl;
int i = 0;
while (true) 
    cin >> i;
    sum += i;
    //cout << i << endl;
    if (cin.peek() == '\n') 
        break;
    
    


cout << "result: " << sum << endl;
return 0;

我认为这段代码有效,你可以输入任何整数和空格,它会计算输入整数的总和

【讨论】:

以上是关于读取以空格分隔的输入数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用scanf读取以空格分隔的数字

如何使用Python 3中的readlines读取由空格分隔的整数输入文件?

C语言 读取数字

读取以逗号分隔的一串数字

C++输入多行数字到数组

PAT1010