将字符串转换为数组,strcpy不起作用

时间:2014-04-01 16:40:34

标签: c++ arrays string visual-studio-2013 strcpy

我尝试使用此算法将字符串转换为数组。 问题是: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相同...

3 个答案:

答案 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; :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;