我在理解我的代码输出时遇到了一些麻烦:
#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()自动附加空字符,为什么会出错?
答案 0 :(得分:2)
你没有复制空字符。 strlen不计算null char。试试这个
memcpy(pipeNames[0], s1.c_str(), len1 + 1);
memcpy(pipeNames[1], s2.c_str(), len2 + 1);
也不需要你的演员阵容。转换是危险的,因为它们可以掩盖编译器错误,因此如果您不需要它们,请不要使用它们。
答案 1 :(得分:2)
这样会更好
memcpy((void*)pipeNames[0], (void*)s1.c_str(), len1 + 1);
^
memcpy((void*)pipeNames[1], (void*)s2.c_str(), len2 + 1);
^
确保null终止复制的字符串。您的初始数组未初始化,因此数组中的数据可以是任何内容 - 因此,如果它不是零,则打印函数将继续输出,直到它们找到空字符。
正如您的评论建议的更好,请使用strcpy
代替