如何从用户输入std::array
?
这就是我所拥有的,但不会编译。
std::array<char, 10> myArray{"hello"} ;
std::cout << "Enter your name: ";
std::cin >> myArray;
如果输入的字符超过10个,请截断并忽略它们。我还需要清除cin缓冲区以允许稍后进行其他输入。
答案 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);
答案 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
答案 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();