以下【ソース例】のように文字列を分割して
格納させようとしたのですが、【出力結果】のように
最後にゴミが付加されてしまいます。
ネットで調べてみたのですが、原因がわかりませんでした。。。
すいませんが、原因と解決策をご教示頂きたいです。
【ソース例】
typedef struct st {
char* a;
} ST;
main( void )
{
ST st;
char* a1;
char* a2;
memset( st, 0, sizeof( ST ) );
a1 = ( char * )calloc( 10, sizeof( char ) );
a2 = ( char * )calloc( 10, sizeof( char ) );
st->a = '12345ABCDEあああああ';
memcpy( a1 , st->a , sizeof( char[10] ) );
memcpy( a2 , st->a+10, sizeof( char[10] ) );
printf( "a1 = %c\n", a1 );
printf( "a2 = %c\n", a2 );
free( a1 );
free( a2 );
}
【出力結果】
a1 = 12345ABCDE"#?
a2 = あああああ・
memcpyでゴミが付加されてしまう・・・
Re:memcpyでゴミが付加されてしまう・・・
申し訳ありませんが、ヘッダーファイルのインクルードをはしょらずに、
お手元にあるコードを「そっくりそのままコピー&ペーストして」
載せていただけないでしょうか。
こちらで、必要なヘッダーファイルをインクルードしてから
コンパイルしたところ、
>memset( st, 0, sizeof( ST ) );
>st->a = '12345ABCDEあああああ';
>memcpy( a1 , st->a , sizeof( char[10] ) );
>memcpy( a2 , st->a+10, sizeof( char[10] ) );
この4行でコンパイルエラーが出ました。
お手元のコードはコンパイルエラーが出ないのでしょうか?
お手元にあるコードを「そっくりそのままコピー&ペーストして」
載せていただけないでしょうか。
こちらで、必要なヘッダーファイルをインクルードしてから
コンパイルしたところ、
>memset( st, 0, sizeof( ST ) );
>st->a = '12345ABCDEあああああ';
>memcpy( a1 , st->a , sizeof( char[10] ) );
>memcpy( a2 , st->a+10, sizeof( char[10] ) );
この4行でコンパイルエラーが出ました。
お手元のコードはコンパイルエラーが出ないのでしょうか?
Re:memcpyでゴミが付加されてしまう・・・
すいません。
職場のソースなので手元になく、思い出して
簡略化して書いたソースで、コンパイルもしておりません。。申し訳ないです。
構造体内のchar*型の文字列を別のchar*変数にmemcpyで分割して
正常にコピーできるのかだけでもご教示頂きたいです。
よろしくお願いいたします。
職場のソースなので手元になく、思い出して
簡略化して書いたソースで、コンパイルもしておりません。。申し訳ないです。
構造体内のchar*型の文字列を別のchar*変数にmemcpyで分割して
正常にコピーできるのかだけでもご教示頂きたいです。
よろしくお願いいたします。
Re:memcpyでゴミが付加されてしまう・・・
こういうことがしたかったのでしょうか。 おしりにゴミが付くのは、たぶん'\0'できちんと終端させていないからだと思います。 #include <stdio.h> #include <stdlib.h> typedef struct st { char *a; } ST; int main(void) { ST *st; char *a1, *a2; st = (ST *) malloc(sizeof(ST)); if (!st) fprintf(stderr, "malloc error\n"), exit(1); a1 = (char *) calloc(10 + 1, sizeof(char)); // +1 は終端の'\0'の分 a2 = (char *) calloc(10 + 1, sizeof(char)); // 同上 if (!a1 || !a2) fprintf(stderr, "calloc error\n"), exit(1); st->a = "12345ABCDEあああああ"; memcpy(a1, st->a , 10); memcpy(a2, st->a + 10, 10); printf("a1 = %s\n", a1); printf("a2 = %s\n", a2); free(st); free(a1); free(a2); return 0; }