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

时间:2014-09-14 18:08:58

标签: c++ arrays c++11

如何从用户输入std::array

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

std::array<char, 10> myArray{"hello"} ;
std::cout << "Enter your name: ";
std::cin >> myArray;

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

6 个答案:

答案 0 :(得分:4)

对于您当前的示例,您应该使用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 << ' ';
    }
}

输出:

$ ./a.out
10 11 12 13 14 15 16 17 18 19
10 11 12 13 14 15 16 17 18 19

基本思想是循环直到数组大小,然后使用其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);
}

对于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;
}

答案 1 :(得分:1)

只需使用适当的工具:

std::string name;
std::cout << "Enter your name: ";
std::getline(std::cin, name);

Live demo

答案 2 :(得分:1)

需要<iostream><limits>标题。

std::cin.get(myArray.data(), myArray.size());
// get() will actually read up to myArray.size() - 1 chars
// and add a null character at the end ('\0')

if (std::cin.fail()) {
    // could not read any characters or EOF occurred
} else {
    // drop rest of line that was read to buffer
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    // number of characters read: std::cin.gcount()

    // ... use myArray ...
}

方法参考:

http://en.cppreference.com/w/cpp/io/basic_istream/get

http://en.cppreference.com/w/cpp/io/basic_ios/fail

http://en.cppreference.com/w/cpp/io/basic_istream/ignore

http://en.cppreference.com/w/cpp/io/basic_istream/gcount

答案 3 :(得分:0)

您可以将整行放入缓冲区,然后将该缓冲区的前10个字节(或整个缓冲区,如果它小于10)提取到数组中。这也解决了std::cin上没有遗留任何垃圾的问题。

std::array<char, 10> myArray{"hello"} ;

std::string s;
std::getline( std::cin, s );
if ( !std::cin )
     throw.....   // input was closed before a line was entered

std::size_t len = std::min( myArray.size(), s.size() );
std::copy(s.begin(), s.begin() + len, myArray.begin() );

请注意,这不会在myArray中创建以空字符结尾的字符串。如果你想这样做,那么复制一个额外的字符(并使len最多为myArray.size() - 1)。

可能需要包含<array><iostream><algorithm>

答案 4 :(得分:0)

在这种情况下,

std::cin期待一个字符指针(char*)。所以你需要使用.data()

std::array<char, 50> arr{"Hello, "};
size_t hello_length = strlen(arr.data());

std::cout << "Enter your name: ";
std::cin >> std::setw(10) >> (arr.data() + hello_length);

std::cout << arr.data() << std::endl;

答案 5 :(得分:0)

在C ++中,数组的指针是第一个元素的地址 对于std::array,我们可以通过数组的指针获得输入。

std::cin >> myArray.begin();