我怎样才能从用户那里得到输入std::array?
这是我所拥有的,但它不会编译。
std::array<char, 10> myArray{"hello"} ;
std::cout << "Enter your name: ";
std::cin >> myArray;
Run Code Online (Sandbox Code Playgroud)
如果输入的字符超过 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 << ' ';
}
}
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)