教えてください、割り当てられた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
strcpy
文字列をコピーする関数です。
文字列は、ヌル文字で終了し、ヌル文字を含む一連の文字です。
char *buf = malloc(BUFSIZ);
このmalloc
呼び出しは、の配列BUFSIZを割り当てますchar
が、これは文字列ではありません。配列をコピーするには、memcpy関数を使用します。
memcpy(temp, buf, BUFSIZ);
配列が文字列(ヌル文字で終了する文字のシーケンス)を保持している場合は、それを使用strcpy
してコピーできます。
まず最初に、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;
}
おそらく必要なのは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
strcpy
メモリの任意の塊ではなく、ゼロで終わる文字列で動作します。
終了文字列を入力した場合は、機能するstrcpy
はずです。そうでない場合は、それがどのように「機能しない」かについての詳細を教えてください。
終了文字列が必要ない場合は、次を使用しますmemcpy
。
memcpy(temp, buf, BUFSIZ);
を掛ける必要はないことに注意してくださいsizeof(char)
。これは定義上 1 であるためです。
実際に C++ を書いているのであれば、生メモリをいじるよりもstd::vector
orを使いたいと思うでしょう。std::string
NUL
に終了文字がありませんbuf
。必ず行う必要がありますbuf[last_actually_used_char+1] = '\0';
。これはbuf
、保存したいデータよりも 1 文字大きくなければならないことを意味します。
これが必要なstrcpy
のは、 が終端の を検索してコピーする情報の長さを見つけるためNUL
です。
safer の使用を強くお勧めします。または、データstrncpy
をコピーするだけの場合(必要ありません)、より高速で安全なを使用することを強くお勧めします。'\0'
memcpy