3

私には機能があります

ClassA::FuncA(const char *filePath)

この const char string* を char* にコピーしたい!

私の解決策:

char *argv[2];
int length = strlen(filePath);
argv[1] = new char(length +1);
strncpy(argv[1], filePath, length); 

この後、argv[1] に目的の文字だけでなく、他の未定義の文字もあります!

ファイルパス:

":\ users \ usera \parameter.xmlÞîÞîþîだ。erだ。erだだ。îだろうerÞîÞerだ。îだ。îÞerだだ。îだ。

ここで何が問題なのですか?ストレングスで長さもOK!

4

4 に答える 4

16

そのようです:

argv[1] = new char[length +1](); // () to value-initialize the array

あなたのバージョン:

argv[1] = new char(length +1);

のみを割り当て、charそれを に値で初期化しlength+1ます。

于 2012-06-13T07:43:32.833 に答える
1

問題はstrncpy、ではなく、を使用していることですstrcpy。そして、あなたがそれを使用している方法では、それは終了をコピーしません\0

実際にはstrncpy、ターミネータなしで文字列を残す可能性があるため\0、それを避けるのが最善です。あなたの場合、strcpy十分な大きさのバッファを割り当てただけなので、単独で問題ありません。より一般的なケースでは、を使用して、使用strlenしている文字列がターゲットバッファに確実に収まるようにする必要があります(結果に1を追加することを忘れないで\0ください)。

状況が頻繁に発生する場合は、独自のバージョンのを作成することをお勧めします。strncpyこれは機能します(つまり、終了\0を保証し、必要以上の文字をコピーまたは書き込みません)。何かのようなもの:

void
stringCopy( char* dest, int maxLength, char const* source )
{
    assert( maxLength > 0 );
    char* end = dest + maxLength - 1;
    while ( dest != end && *source != '\0' ) {
        *dest = *source;
        ++ dest;
        ++ source;
    }
    *dest = '\0';
}

(この関数は実際にはC 2011の名前strcpy_sで存在しますが、広く実装されていません。Microsoftにはありますが、他の場所では見たことがありません。)

于 2012-06-13T08:21:38.953 に答える
1

コードに 2 つの問題があります。

  • null 文字をコピーするには、コピー後に length に 1 を追加する必要があります (strlen は null 文字を含まない文字数のみを返すため、詳細はこちらを参照してください)。コードを次のように変更します。

    strncpy(argv[1], filePath, 長さ + 1);

  • 1文字のみを初期化しているため、配列の初期化方法を修正する必要があります(完全な文字列をコピーする必要があると想定しています)。そう:

    argv[1] = 新しい char[長さ + 1]();


ノート:

  • このような問題は、多くの場合、データを印刷するために呼び出すものに依存するため、データを印刷するために使用されたコードも投稿するときに投稿してください。
  • そして最後に、最大パスに初期化された固定サイズの配列だけを使用することを検討するかもしれません。投稿後の Windows チェックアウトの最大パス サイズについて
于 2012-06-13T07:55:40.510 に答える
0

strncpy()length文字以下をコピーします。そうすることで、終了\0はコピーされませんでした。

于 2012-06-13T07:45:23.377 に答える