我尝试使用此算法将字符串转换为数组。 问题是: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相同...
答案 0 :(得分:2)
代码中的一个问题是string::size
为您提供了除空终止之外的字符数。因此messagio
没有足够的空间容纳以空字符结尾的字符串,而strcpy
将尝试超出其边界。
至于警告,这是因为strcpy
很容易超出范围。如果源字符串的长度大于目标缓冲区的长度,则会得到未定义的行为。建议的替代方案为您提供了保护自己的方法(但不是100%万无一失)。
如果你想要的是一个包含字符串字符的类数组对象,那么执行此操作的惯用方法是使用向量:
std::vector<char> messagio(tmp.begin(), tmp.end());
如果您真的想要一个字符串,那么只需使用std::string
。
答案 1 :(得分:0)
实际上你得到的错误不是错误。这是一个警告。也许您设置了编译器选项,强制编译器将所有警告视为错误。
您的代码有错误。分配数组的大小应大于字符串的大小,以容纳函数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() );
答案 2 :(得分:0)
[解决]
总而言之,特别是来自莫斯科的弗拉德&#34; :3std::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;