0

教えてください、割り当てられたchar配列を「通常の」char配列にコピーする正しい方法は何ですか? 私は次のことを試みましたが、失敗します:

char * buf = (char *) malloc (BUFSIZ * sizeof(char));
// filling up the allocated array with stuff...
char temp[BUFSIZ];
strcpy(temp, buf); // strcpy doesn't work
4

5 に答える 5

1

strcpy文字列をコピーする関数です。

文字列は、ヌル文字で終了し、ヌル文字を含む一連の文字です。

 char *buf = malloc(BUFSIZ);

このmalloc呼び出しは、の配列BUFSIZを割り当てますcharが、これは文字列ではありません。配列をコピーするには、memcpy関数を使用します。

memcpy(temp, buf, BUFSIZ);

配列が文字列(ヌル文字で終了する文字のシーケンス)を保持している場合は、それを使用strcpyしてコピーできます。

于 2012-02-08T13:50:50.390 に答える
1

まず最初に、mallocエラーを隠す可能性があるため、(とにかく C で) の戻り値をキャストしないでください。

第二に、常に 1 になることが保証されているため、掛ける必要はありませsizeof(char)。掛けるとコードが詰まります。

そして、実際の質問に関しては、次を使用できます。

memcpy (temp, buff, BUFFSZ);

文字配列全体をコピーします。

Cの「文字列」の処理について言及せず、文字配列のみを扱うため、それがあなたの望むものだと思います。

実際にC 文字列を処理strcpyている場合、この場合は正常に動作します。

  • バッファーの最後に、終端のゼロバイト用のスペースがあります。と
  • 実際にそこにゼロバイトを入れました。

たとえば、次の小さなスニペットは正常に機能します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) {
    // Two buffers.

    char buff1[4];
    char *buff2 = malloc (4);
    if (buff2 == NULL) {
        puts ("No memory!");
        return 1;
    }

    // Populate first buffer.

    buff2[0] = 'p';
    buff2[1] = 'a';
    buff2[2] = 'x';
    buff2[3] = '\0';

    // Transfer and print.

    strcpy (buff1, buff2);
    puts (buff1);

    // Free and exit.

    free (buff2);
    return 0;
}
于 2012-02-08T13:47:16.567 に答える
1

おそらく必要なのはstrncpy()、文字列から特定のバイト数までコピーする です。

strncpy(temp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string

それも失敗した場合は、おそらく使用してくださいmemcpy()

memcpy(tmp, buf, BUFSIZ - 1);
temp[BUFSIZ - 1] = '\0'; // null terminate the string
于 2012-02-08T13:44:45.250 に答える
1

strcpyメモリの任意の塊ではなく、ゼロで終わる文字列で動作します。

終了文字列を入力した場合は、機能するstrcpyはずです。そうでない場合は、それがどのように「機能しない」かについての詳細を教えてください。

終了文字列が必要ない場合は、次を使用しますmemcpy

memcpy(temp, buf, BUFSIZ);

を掛ける必要はないことに注意してくださいsizeof(char)。これは定義上 1 であるためです。

実際に C++ を書いているのであれば、生メモリをいじるよりもstd::vectororを使いたいと思うでしょう。std::string

于 2012-02-08T13:45:24.593 に答える
0

NULに終了文字がありませんbuf。必ず行う必要がありますbuf[last_actually_used_char+1] = '\0';。これはbuf、保存したいデータよりも 1 文字大きくなければならないことを意味します。

これが必要なstrcpyのは、 が終端の を検索してコピーする情報の長さを見つけるためNULです。

safer の使用を強くお勧めします。または、データstrncpyをコピーするだけの場合(必要ありません)、より高速で安全なを使用することを強くお勧めします。'\0'memcpy

于 2012-02-08T13:45:06.427 に答える