C++ Can';t在C+中将std::cin与char*或char[]一起使用+;20

C++ Can';t在C+中将std::cin与char*或char[]一起使用+;20,c++,c++20,C++,C++20,它过去的工作方式是:从std::cin读取动态分配的char数组,或者读取作为参数传入的数组(参见下面的MCVE) 所以我完全明白编译器的抱怨。但是如何使用std::cin和作为参数传入的数组,或者动态数组 (也就是:C++在准备读取时,知道数组是动态创建还是静态创建?它不应该在声明后能够画出这个区别)< < 但是,如何将cin与作为参数传入的数组或动态数组一起使用呢 不要。如果你有一个char数组,给它一个char数组 void read (char (&str)[256]) // n

它过去的工作方式是:从
std::cin
读取动态分配的
char
数组,或者读取作为参数传入的数组(参见下面的MCVE)

所以我完全明白编译器的抱怨。但是如何使用
std::cin
和作为参数传入的数组,或者动态数组

(也就是:C++在准备读取时,知道数组是动态创建还是静态创建?它不应该在声明后能够画出这个区别)< < 但是,如何将cin与作为参数传入的数组或动态数组一起使用呢

不要。如果你有一个char数组,给它一个char数组

void read (char (&str)[256]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}

// or if we don't care about the size, we just want an array

template <std::size_t N>
void read (char (&str)[N]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}

(也就是:C++在准备读取时,知道数组是动态创建还是静态创建?它不应该在声明后能够画出这个区别)< <


并不是说它知道它可以阅读,而是它知道它可以阅读的大小。当你给它一个指针时,它只需要相信指针指向足够的内存。如果通过引用传递数组给它一个数组,那么编译器知道它可以读取的大小,因为数组的大小是类型信息的一部分,而不是指针。不要把数组分解成指针和数组变成指针混为一谈。它们是两种不同的东西。

你能将输入读入
std::string
并最终在需要时将内容复制到char数组中吗?编译器知道,因为类型不同。一个是
char[256]
,另一个是
char*
。但是如何将cin与作为参数传入的数组或动态数组一起使用呢?--问题是您以前没有传递数组或动态数组。你总是在传递一个指针。要传递数组,请参见答案。传递一个“动态数组”,即
std::string
@Barry Good call。不知道为什么我以为我在输出。更新。仍然无法
cin
进入'string\u view':-)@Barry好的,咖啡休息时间。您知道是否有可用的标准适配器吗?我查看了span,但与其他容器一样,它没有任何输入或输出运算符。不要这样认为,不。不过,编写包装
istream::get
的内容可能不太难。
binary '>>': no operator found which takes a right-hand operand of type 'char *' (or there is no acceptable conversion) 
void read (char (&str)[256]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}

// or if we don't care about the size, we just want an array

template <std::size_t N>
void read (char (&str)[N]) // now we have a reference to an array, so we know its size
{
    std::cin >> str;
}
void read (std::string& str)
{
    std::cin >> str;
}