0

我在理解我的代码的此输出时遇到了一些麻烦:

#define MAX 5

char pipeNames[MAX][1024];
string s1 = "\\\\.\\p\\p1";
string s2 = "\\\\.\\p\\p2";
int len1 = strlen(s1.c_str());
int len2 = strlen(s2.c_str());
memcpy((void*)pipeNames[0], (void*)s1.c_str(), len1);
memcpy((void*)pipeNames[1], (void*)s2.c_str(), len2);
cout<<pipeNames[0];
cout<<endl<<len1;
cout<<endl<<pipeNames[1];
cout<<endl<<len2;

实际输出:

\\.\p\p1É┼é|
8
\\.\p\p2
8

预期输出:

\\.\p\p1
8
\\.\p\p2
8

为什么在 pipeNames[0] 的末尾会打印额外的字符。我正在使用 string::c_str() 自动附加空字符,那么为什么会出错?

4

2 回答 2

2

你不是在复制空字符。strlen 不计算空字符。试试这个

memcpy(pipeNames[0], s1.c_str(), len1 + 1);
memcpy(pipeNames[1], s2.c_str(), len2 + 1);

也不需要你的演员表。强制转换是危险的,因为它们可以掩盖编译器错误,所以如果你不需要它们就不要使用它们。

于 2012-07-28T12:18:41.987 回答
2

这会更好

memcpy((void*)pipeNames[0], (void*)s1.c_str(), len1 + 1);
                                                      ^
memcpy((void*)pipeNames[1], (void*)s2.c_str(), len2 + 1);
                                                      ^

以确保您 null 终止复制的字符串。您的初始数组未初始化,因此您的数组中的数据可以是任何开始 - 所以如果它不是零,您的打印函数将继续输出,直到它们找到一个空字符。

正如您的评论之一所建议的那样更好,请strcpy改用

于 2012-07-28T12:19:22.577 回答