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

33

这可能是一个完全新手的问题,但我还没有找到适合自己的答案。

目前,我正在为一个课程编写程序,该程序接受用户输入(可以是一个或多个由空格分隔的数字),然后确定该数字是素数、完全数还是既非素数也非完全数。如果该数字是完全数,则会显示其除数。

到目前为止,我已经编写了判断素数、完全数和列出除数的代码。我卡在了程序的输入部分。我不知道如何使由空格分隔的输入逐个通过我的循环。

这是我的当前程序:

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;
它可以工作,但只适用于单个数字。如果有人能帮我使其能够读取由空格分隔的多个输入,那将不胜感激。另外,顺便说一下,我不知道会输入多少数字,所以我不能为每个数字都设置一个变量。它将是随机数量的数字。
谢谢!

6个回答

24

默认情况下,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 将尝试从输入中读取一个数字。因此,是的,它将读取下一个数字,就像您在这个例子中看到的一样:http://ideone.com/ZHvdVx - Murilo Vasconcelos
1
现在我已经成功编写了程序并显示了所有数字,但格式化是个问题。例如: 您输入的数字是6。 1 2 3 6 6 是完美的!我希望“6是完美的”在下一行显示。因此,在开始新循环之前的最后一个数字时,是否有一种方法可以将其更改为不同的行? - Raymond Aaron
有的。每当你想要一个新行时,你可以使用 cout 输出一个 '\n' - Murilo Vasconcelos
谢谢大家的帮助!我现在只需要想办法让它每行最多只显示7个数字。你们太棒了!^_^ - Raymond Aaron
一直在尝试弄清楚如何使程序再次循环,如果用户需要的话。我询问他们是否想要再次运行程序,但我无法让它重新开始循环。有什么想法吗? - Raymond Aaron

23
我建议将行读入字符串,然后根据空格进行分割。为此,您可以使用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的字符串->整数转换混淆了,当给定一个不是数字的字符串时会抛出一个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用于确定是否执行您的操作,还是打印错误消息。


哇,哈哈,你应该成为我的教授。感谢你的帮助!学习新方法总是很棒的体验!另外说一下,我即将加入代码,如果用户输入的不是整数,它会询问他们是否要再次尝试运行程序。这门课很简单,所以我不需要做最复杂的编程,但我想知道如何做,并且在我的脑海中存储起来,以便我想要炫耀一下时可以使用。;] 非常感谢你的帮助! - Raymond Aaron
@RaymondAaron:没问题!我会编辑帖子,包括你的其他问题,因为评论中的格式有些受限。 - Logan Nichols

6

您需要:

  • 从控制台中读取整行
  • 对该行进行分词,按空格分割
  • 将这些分割的部分放入数组或列表中
  • 遍历该数组/列表,并执行质数/完全数等测试操作。

您的班级目前在这些方面有何了解?


很奇怪,什么都没有。我不知道我们应该如何做。我在看我们课本中的数组,但我还没有完全弄清楚如何在我的程序中使用它。我想我只是不知道如何正确地做。 - Raymond Aaron

5
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;
}

我认为这段代码可行,您可以输入任意整数和空格,它会计算输入整数的总和。


0
std::vector<int> num{};
int buf;

    do{
        std::cin >> buf;
        num.push_back(buf);
    }while(std::cin.peek() == ' ');

-2
在C语言中,您可以使用scanf来执行此操作:
scanf('%d %d',&a,&b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接