0

これは文字列をコピーするはずですが、文字化けした結果を出力します。誰でも私を助けることができますか?

int main () {       

    const char *a = "Hello\n";
    const char *b = "World\n";

    strncpy(&b, &a, strlen(a)); 
    printf("%s %s", a, b);  
    return 0;

}

「Hello Hello」を期待していますが、端末は次のように出力します。

\
    Hello

GCC は、strncpy の署名にもかかわらず、a と b が互換性のないポインター型を持つという警告を出力します。

char * strncpy(char *s1, const char *s2, size_t n)

2 char ポインターを要求します。https://stackoverflow.com/a/20213168に記載されているように、配列は常に char** であるためですか?

4

4 に答える 4

3

2 つの問題:

  1. が指すバッファーにはコピーしないでくださいconst char *。これは定数バッファーであるためです。
  2. の引数strncpychar *s ですが、 を渡しchar **たため、ポインターが指す内容ではなく、ポインター自体を上書きします。
于 2014-03-18T19:10:04.997 に答える
3

char **予想される場所を 2 回通過してchar*います。

&bは のアドレスをとり、 はbbありchar*、 のアドレスですchar。そう&bですchar **。にも同じ問題が発生しaます。


アップデート:

見たbのは配列ではなく、「文字列」リテラルを指すポインターです。後者は定数であり、変更することはできないため、リテラルのアドレスへのコピー ( の前に -operator が間違って配置されているため、コードが実際に行っていないこと) は失敗する必要があります。&b

この定義を回避するには、次bのように定義します

char b [] = "World\n";

それは、配列が常に char** であるためですか [...]

配列常にchar **」ではありません。

配列が引数として関数に渡されると、最初の要素へのポインターに減衰します。そう

char b[] = "test";

に崩壊するだろう

char * pb

`"test" の最初の文字であるをpb指します。char 't'

于 2014-03-18T19:08:09.767 に答える
2

2 つの問題:

1)が aおよびa のstrncpy(a, b, strlen(a))場合は、 を使用する必要があります。あなたが得ているコンパイルエラーはこれを暗示しています。achar*bconst char*

2)未定義の動作があります。const char*文字列リテラルを割り当てました。コンパイラはそれらを読み取り専用メモリに配置する場合があります。また、それらのいずれかを変更しようとする試みは許可されていません。単一の要素の変更でさえ、プログラムのクラッシュを引き起こす可能性があります。

1 つの救済策は、 を使用することchar* b = malloc(/*ToDo - your size here*/);です。free使い終わったら思い出を思い出してください。

于 2014-03-18T19:10:39.207 に答える
2

でコードをコンパイルすると、-Wallこれを修正する方法を示す警告が表示されます。

于 2014-03-18T19:09:33.680 に答える