It used上班:阅读std::cin
到动态分配的char
array - 或作为参数传入的数组(请参阅下面的 MCVE)。
#include <iostream>
void read (char str[256]) //or omit the # between the []'s -- no difference
{
std::cin >> str; //error
}
int main ()
{
char s1 [256];
char* s2 = new char[256];
char s3 [256];
std::cin >> s1; //OK
std::cin >> s2; //error
read (s3);
return 0;
}
我相信问题出在 C++20 更新上。其目的是为了防止std::cin
从溢出它正在读入的字符串,并且 cppreference.com 确实列出了新的原型 https://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2 for std::istream
's operator>>
现在有CharT (&s)[N]
, not CharT* s
,作为论证。
确认:此 MCVE 适用于 g++ 10(不支持此功能),并且适用于使用 Default 作为语言标志的 Visual Studio;但使用/std:c++latest
,VS抱怨:
binary '>>': no operator found which takes a right-hand operand of type 'char *' (or there is no acceptable conversion)
所以我完全理解编译器的抱怨。但我该如何使用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;
}
如果您有动态大小,请使用std::string
仍然适用于cin
void read (std::string& str)
{
std::cin >> str;
}
(另外:当准备好读取时,C++ 如何知道数组是动态创建的还是静态创建的?它不应该在声明后能够区分!)
这并不是说它知道它已准备好读取,而是它知道它可以读取的大小。当你给它一个指针时,它只需相信指针指向足够的内存。如果你给它一个数组,通过引用传递数组,那么编译器就知道它可以读取的大小,因为数组的大小是类型信息的一部分,与指针不同。不要将数组的退化为指针与数组作为指针混淆。他们是两个不同的东西。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)