在C++中将以空格分隔的输入读入数组

3
什么是将以空格分隔的输入读入数组的最简单方法?
//input:5
        1 2 3 4 7



int main() {
    int n;
    cin>>n;
    int array[n];
    for (int i =0;i<n;i++){
        cin>>array[i];
    }
    cout<<array; 
    return 0;
}  

我尝试了上面的代码,但输出结果是0x7ffe42b757b0。

1
定义“不工作”。这是问题最无用的描述。 - Algirdas Preidžius
“它不起作用”并没有告诉我们任何信息。实际上会发生什么?它会崩溃吗?它会将所有内容读入数组的第一个元素中吗?还是其他什么情况? - ChrisF
1
另外,我发现问题(我认为)。可变长度数组不是标准C ++。建议使用std :: vector - Algirdas Preidžius
猜测:您对输出感到困惑,将责任归咎于错误的代码。cout << array 不会产生您期望的结果。 - Christopher Creutzig
输入始终是它吗?还是可以是其他任何东西? - Chiel
1
可能是[在C++中打印数组?]的重复问题(https://dev59.com/83M_5IYBdhLWcg3wdy1g)。 - sashoalm
3个回答

5
问题在于你的打印输出。由于 array 是一个指针,所以你只打印了地址值。
而应该这样做:
for (int i =0;i<n;i++){
    cout<< array[i] << " ";
}

非常感谢。这就是问题所在。自从我从Python转到C++后,我遇到了很多类似的问题。 - J.Ren
@J.Ren。C++有许多功能可供使用,可以避免使用固定大小数组。在我的示例中,您可以输入任何大小的字符串。 - Chiel

3

您可以通过将std::istream_iterator传递给std::vector构造函数来实现:

std::vector<int> v{
    std::istream_iterator<int>{std::cin}, 
    std::istream_iterator<int>{}
    };

std::vector有一个接受2个输入范围的迭代器的构造函数

istream_iterator<int>是一个从std::istream读取int的迭代器。

这种方法的缺点是无法设置结果数组的最大大小,而且它会一直读取流直到结束。


如果你需要读取固定数量的元素,则可以使用以下代码:

int arr[5]; // Need to read 5 elements.
for(auto& x : arr)
    if(!(std::cin >> x))
        throw std::runtime_error("failed to parse an int");

这是一个很酷的构造,你能解释一下它确切的作用吗? - Chiel
@Chiel,我已经为你添加了参考文献。 - Maxim Egorushkin
我无法运行这个程序。如果我将它放在我的示例中,它会一直要求输入而无法停止。 - Chiel
你的示例在clang上无法运行。它永远不会结束cin。 - Chiel
@Chiel 使用 std::copy_n,请参考这篇文章 - O'Neil
@MaximEgorushkin,您能否让这个示例代码正常运行,并像您之前提供的代码一样编写一个可工作的测试代码呢? - Chiel

1

数组变量始终给出数组的基地址

for (int i =0;i<n;i++){
    cout<< array[i] << " ";
    cout<<*(array+i)<< " ";
}

两个cout语句都只会打印相同的内容。 简而言之, array[i]编译器会自动转换为*(array+i)。

在第二个cout语句中,从数组的基地址开始不会添加值,因为它是一个指针,每次增加都会增加sizeof(int)。


@O'Neil,你是正确的!我知道这个错误,但错过了。谢谢你指出这个错误。 - Gokulnath

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