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] の末尾に余分な文字が表示されるのはなぜですか。null 文字を自動的に追加する 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 で終了するようにします。初期配列は初期化されていないため、配列内のデータは最初から何でもかまいません。したがって、ゼロでない場合、印刷関数は null 文字が見つかるまで出力を続けます。

あなたのコメントの1つが示唆するように、strcpy代わりに使用してください

于 2012-07-28T12:19:22.577 に答える