繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM