繁体   English   中英

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

[英]How do I get user input from cin into C++11 std::array

如何从用户输入std::array

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

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

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

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

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

如果要避免临时,可以按如下方式修改函数:

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

只需使用适当的工具:

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

现场演示

需要<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

您可以将整行放入缓冲区,然后将该缓冲区的前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创建以null结尾的字符串。 如果你想这样做,那么复制一个额外的字符(并使len最多为myArray.size() - 1 )。

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

在这种情况下, std::cin期待一个char指针( 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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM