以下【ソース例】のように文字列を分割して
格納させようとしたのですが、【出力結果】のように
最後にゴミが付加されてしまいます。
ネットで調べてみたのですが、原因がわかりませんでした。。。
すいませんが、原因と解決策をご教示頂きたいです。
【ソース例】
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でゴミが付加されてしまう・・・
-
box
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で分割して
正常にコピーできるのかだけでもご教示頂きたいです。
よろしくお願いいたします。
-
box
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;
}