[英]Convert string to array, strcpy don't work
我尝试使用此算法将字符串转换为数组。 问题是这样的:strcpy不起作用。
我也试过:strcpy_s strncpy memcpy - >用这个函数我的数组只能打印第一个单词(不知道为什么)...
string tmp;
getline(cin, tmp);
char* messaggio = new char[tmp.size()];
ZeroMemory(messaggio, tmp.size());
strcpy(messaggio, tmp.c_str());
tmp.resize(NULL);
我使用Visual Studio 2013 ...当我尝试使用strcpy我有一个奇怪的错误:C4996可能不安全。 如果我尝试使用strcpy_s是相同的,与strncpy相同...
您的代码中的一个问题是string::size
为您提供了除空终止之外的字符数。 因此, messagio
没有足够的空间容纳一个以空字符结尾的字符串,而strcpy
会尝试超出其范围。
至于警告,这是因为strcpy
使它很容易走出界限。 如果源字符串的长度大于目标缓冲区的长度,则会得到未定义的行为。 建议的替代方案为您提供了保护自己的手段(但不是100%万无一失)。
如果你想要的是一个包含字符串字符的类数组对象,那么执行此操作的惯用方法是使用向量:
std::vector<char> messagio(tmp.begin(), tmp.end());
如果你真的想要一个字符串,那么只需使用std::string
。
你实际上得到的错误不是错误。 这是一个警告。 也许您设置了编译器的选项,强制编译器将所有警告视为错误。
您的代码有错误。 分配的数组的大小应该大于字符串的大小,以容纳函数std::strcpy
使用的终止零
所以你应该写
std::string tmp;
std::getline( std::cin, tmp );
char* messaggio = new char[tmp.size() + 1];
std::strcpy( messaggio, tmp.c_str() );
或者你可以写
strcpy_s( messaggio, tmp.size() + 1, tmp.c_str() );
虽然函数strcpy_s
不是标准的C ++函数。 它仅存在于C标准中。
我相信你应该忽略这个警告。
如果您的编译器支持类std::dynarray
您可以使用它而不是原始指针。
例如
std::dynarray<char> messagio( tmp.size() + 1 );
std::strcpy( messagio.data(), tmp.c_str() );
[解决了]
总而言之,特别是“来自莫斯科的弗拉德”:3
std::string tmp;
tmp.resize(0);
std::getline(std::cin, tmp);
char* messaggio = new char[tmp.size()+1];
strcpy_s(messaggio, tmp.size()+1, tmp.c_str());
send(ConnectSocket, messaggio, tmp.size()+1, NULL); //Send 2
tmp.resize(0);
delete messaggio;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.