cout 不在 for 循环外执行

cout not executing outside a for loop

我正在编写一个程序,输出用户输入的总和,space-分隔的整数(不超过 100)。我应该将值读入数组,以便输入“1 2 3”产生“6”。

这是我目前拥有的:

#include <iostream>
using namespace std;

int main() {
int i= 0;
int total = 0;
int input[100];

cout << "Please enter a series of integers, space separated, that you would
enter code here`like to calculate the sum of: " << endl;

for(; i < 100; i++)
{
    cin >> input[i];
    total += input[i];
}
cout << "The sum of these values is: " << total << endl;

getchar();
return 0;
}

按原样编码,不会打印总数。如果我在 for 循环的末尾 cout,然后编译并输入 1 2 3,它会打印 1 3 6。这是我所期望的。

此外,当我将数组大小设置为 5 并 运行 它(按原样编码)时,我发现如果我在每个值后按回车键,它会打印五个数字的总和。

但我需要它来读取 space 分隔值,而不是换行符分隔值。如何在不使用 material 的情况下修改它我还没有学会(向量,指针...)?

如有任何提示、技巧或批评,我们将不胜感激!

1) 需要将数据转成string
2) 根据space拆分成数组
3)然后循环和总计或使用std::accumulate

您可以将所有数字和 space 分隔符合并为一个字符串。 将每个 space 更改为 '\0' 以创建一系列单独的字符串。 您可以使用 atoi.

将每个字符串转换为整数

希望我有所帮助,

cin 没有通过 space 得到所有的值,你必须在每个单个值之后输入...如果你想得到所有的数字你可以把它作为一个字符串然后转换它到整数...事实上,当你只输入一串由 space 分隔的数字时,cin 代码还没有完成,它需要 99 个其他输入,你无法达到 cout

有一个 std::noskipws 允许显式获取空白分隔符。为了检查分隔符(可能会传递多个分隔符),我编写了以下函数:

bool wait_for_number(istream& is) {
    char ws;

    do {
        ws = is.get();

        if(!is.good())
            throw std::logic_error("Failed to read from stream!");

        if(ws == '\n')
            return false;
    } while(isspace(ws));

    if(isdigit(ws))
        is.putback(ws);
    else if(ws != '\n')
        throw std::logic_error(string("Invalid separator was used: '") + ws + "'");

    return true;
}

循环中需要额外的条件:

bool hasnumbers = true;
for(; hasnumbers && i < 100; i++) {
    int number;

    cin >> noskipws >> input[i];
    total += input[i];

    hasnumbers = wait_for_number(cin);
}

注意 noskipws 用于 cin 的表达式。

一些测试用例:

  • 这些案例工作正常:

    echo '2' | ./skipws > /dev/null
    echo '1 2' | ./skipws > /dev/null
    echo '1 2 ' | ./skipws > /dev/null
    echo '1 2 3' | ./skipws > /dev/null
    echo '1   3' | ./skipws > /dev/null
    
  • 这种情况导致 "Failed to read from stream!":

    echo '' | ./skipws > /dev/null
    echo ' ' | ./skipws > /dev/null
    echo ' 1 2' | ./skipws > /dev/null
    
  • 这种情况导致 "Invalid separator was used" 错误:

    echo '1XXX3' | ./skipws > /dev/null
    

顺便说一下,您可以使用易于重新分配的 vector<int>,这样您的程序就不会被限制为 100 个数字。

很多其他人似乎都在解决空白问题,但我假设您的意思是您在不同的行中输入了这些数字。如果您在一行中输入它们,这只能解决您一半的问题。

我看到的主要问题是您只输入了 3 个数字,但是 运行 for 循环 100 次。如果您输入 100 个数字,您将得到一个总数。这很可能不是您想要的行为。我提出了一种更好的处理方法:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

int main()
{
    int total = 0;
    int input[100];

    std::string buffer = "";

    for(int i = 0; i < 100; i++)
    {
        cin >> buffer;
        if(buffer != "e")
        {
            input[i] = atoi(buffer.c_str());
            total += input[i];
        }
        else
        {
            i = 100;
        }
    }

    cout << "The sum of these values is: " << total << endl;

    getchar();
    return 0;
}

我不会说这是理想的,但它按预期工作。您可能还想将 int 数组归零,具体取决于您使用它的目的,因为不能保证所有单元格都已写入。

当我编译它时,第 9 行的 cout 语句出现错误,我能够修复它。它在那之后编译,当我输入数字时它就可以了。这会花很长时间,因为你需要 100 个数字才能输入数组,但是当我将它更改为 10 个数字并输入 10 个数字时,它工作正常。

我想你只需要检查下一个字符,在读取一个 int 之后,是否是 space。如果没有结束循环:

#include <iostream>
using namespace std;

int main()
{
    int total = 0;
    int input[100];

    cout << "Please enter... blah blah blah... the sum of: " << endl;

    for(int i = 0; i < 100; ++i)
    {
        cin >> input[i];
        total += input[i];

        // space means more to come else exit loop (break)
        if(cin.peek() != ' ')
            break;
    }

    cout << "The sum of these values is: " << total << endl;

    getchar();
    return 0;
}

输出:

Please enter... blah blah blah... the sum of: 
1 2 3
The sum of these values is: 6

函数 cin.peek() returns 流中的下一个字符而不提取它。