【问题标题】:Reading space separated input into an array in C++将空格分隔的输入读入C++中的数组
【发布时间】:2016-04-07 09:05:23
【问题描述】:

将空格分隔的输入读入数组的最简单方法是什么?

//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。

【问题讨论】:

  • 定义doesn't work。这是对问题最无用的描述。
  • “它不起作用”并没有告诉我们任何事情。实际发生了什么?它会崩溃吗?它是否将所有内容都读入数组的第一个元素?还有什么?
  • 另一方面,我注意到了问题(我认为)。可变长度数组不是标准 C++。考虑使用std::vector。
  • 疯狂猜测:您对输出感到困惑,并将责任归咎于错误的部分。 cout &lt;&lt; array 没有做你想做的事。
  • Printing an array in C++?的可能重复

标签: c++


【解决方案1】:

问题在于您的打印。因为array 是一个指针,所以你只是打印一个地址值。

相反,这样做:

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

【讨论】:

  • 非常感谢,就是这个问题。自从我从Python改成C++后,遇到过很多这样的问题。
  • @J.Ren。 C++ 提供了许多特性,使您不必使用固定大小的数组。在我的示例中,您可以输入任意大小的字符串。
【解决方案2】:

您可以通过将std::istream_iterator 传递给std::vector 构造函数来做到这一点:

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

std::vector has a constructor that accepts 2 iterators to the input range。

istream_iterator&lt;int&gt; 是一个从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 为您添加了参考资料。
  • 我无法运行它。如果我把它放在我的例子中,它永远不会停止要求输入。
  • 您的示例不适用于 clang。它永远不会结束 cin
  • @Chiel 使用std::copy_n,见this article。
【解决方案3】:

数组变量总是给出数组的基地址

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

两个 cout 语句只会打印相同的内容。 简而言之 array[i] 编译器只会像这样在内部转换为 *(array+i)

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

【讨论】:

  • @O'Neil 你是对的!我知道但错过了。感谢您指出该错误
猜你喜欢
  • 1970-01-01
  • 2021-03-23
  • 2013-01-16
  • 2015-12-03
  • 2012-10-17
  • 1970-01-01
  • 2011-11-30
  • 2012-03-06
  • 2021-01-28
相关资源
最近更新 更多