如何将用户输入从 cin 输入到 C++11 std::array

dma*_*ect 4 c++ arrays c++11

我怎样才能从用户那里得到输入std::array

这是我所拥有的,但它不会编译。

std::array<char, 10> myArray{"hello"} ;
std::cout << "Enter your name: ";
std::cin >> myArray;
Run Code Online (Sandbox Code Playgroud)

如果输入的字符超过 10 个,请截断并忽略它们。我还需要清除 cin 缓冲区,以便稍后进行其他输入。

Rap*_*ptz 5

对于您当前的示例,您应该使用std::string而不是std::array<char, 10>. 但是,如果您仍然想读取一个数组,您可以按如下方式进行:

#include <iostream>
#include <array>

int main() {
    std::array<int, 10> arr;
    for(int temp, i = 0; i < arr.size() && std::cin >> temp; ++i) {
        arr[i] = temp;
    }

    for(auto&& i : arr) {
        std::cout << i << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

#include <iostream>
#include <array>

int main() {
    std::array<int, 10> arr;
    for(int temp, i = 0; i < arr.size() && std::cin >> temp; ++i) {
        arr[i] = temp;
    }

    for(auto&& i : arr) {
        std::cout << i << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

基本思想是循环直到数组大小,然后使用其operator[]. 您保持std::cin >> temp循环条件以捕获插入过程中的错误。请注意,标准库中没有为您执行此操作的内置函数。

如果你发现自己经常这样做,你可以把它移到你自己的函数中:

#include <iostream>
#include <array>

template<typename T, size_t N>
std::istream& input_array(std::istream& in, std::array<T, N>& arr) {
    unsigned i = 0u;
    for(T temp; i < arr.size() && in >> temp; ++i) {
        arr[i] = std::move(temp);
    }
    return in;
}

int main() {
    std::array<int, 10> arr;
    input_array(std::cin, arr);
}
Run Code Online (Sandbox Code Playgroud)

你不应该重载命名空间operator>>内的东西,std因为这是未定义的行为。

如果你想避免临时,你可以修改函数如下:

template<typename T, size_t N>
std::istream& input_array(std::istream& in, std::array<T, N>& arr) {
    for(unsigned i = 0u; i < arr.size() && in >> arr[i]; ++i) { 
        // empty body
    }
    return in;
}
Run Code Online (Sandbox Code Playgroud)