ページ 1 / 1
文字列コピー
Posted: 2007年3月04日(日) 23:05
by ふぐお
文字列をコピーするプログラムです。
<per>#include <stdio.h>
void st(char *,char *);
int main(void)
{
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
void st(char *c,char *a)
{
int i;
for(i=0;*(a);i++){
c=a;
}
c[i1]='\0';
}</per>
コピーした文字列が表示されません。
どこがおかしいか教えてください
Re:文字列コピー
Posted: 2007年3月04日(日) 23:08
by ふぐお
すいません
c[i1]='\0';は
c[/url]i='\0';です
Re:文字列コピー
Posted: 2007年3月04日(日) 23:39
by 管理人
>c[/url]i='\0';です
ということですが、このような書き方は出来ません、どのようなことがここでさせたいのでしょうか?
格納した文字列の最後に終端記号を入れたいのでしょうか?
それでしたら
cにいれないといけませんが。
そこを直せば後は悪くないはずです。
なお、タグは
<per>ではなく、<pre>です。
Re:文字列コピー
Posted: 2007年3月04日(日) 23:43
by box
> for(i=0;*(a);i++){
*(a) が正しくありません。
*(a) もしくは *a は、aが指している1文字のことです。
それが '\0' でない間ループを回り続けますので、
状況によっては無限ループに陥ってしまうと思います。
*(a)
のかわりに
a != '\0'
と書けば、うまくいくと思います。
Re:文字列コピー
Posted: 2007年3月05日(月) 00:04
by 管理人
あら、そのように書かれていたとは、すみません^^;
しかし無限ループにはならず、257回ループしたところで毎回breakされるのですが、
これは*aの内容がcの256バイトを超えてc
に書き込んだことで変更されたことにより
breakされたんでしょうか?
つまりたまたまa[256]が\0であり、c[256]はたまたまその\0がはいったんでしょうか?
aは6バイトのはずですからa[6]~a[256]は何が入っているかわからないですね。
確認したプログラムはこちらで
#include <stdio.h>
void st(char *c,char *a){
int i;
for(i=0;*a;i++){
c=a;
printf("%c\n",*a);
}
printf("%dでbreak\n",i);
c='\0';
return ;
}
int main(void){
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
実行結果
H
H
H
H
....(略 256回分)
H
H
H
H
H
←i==256でこの部分*aが\0に書き換えられた?
257でbreak
Hello
このようになりました。
*aがi==256の時\0に書き換えられたのでしょうかね。
Re:文字列コピー
Posted: 2007年3月05日(月) 08:50
by 管理人
やはりそのようです。
c[256]は*aと同じアドレスですね。
#include <stdio.h>
void st(char *c,char *a){
int i;
for(i=0;*a;i++){
c=a;
}
for(i=0;i<256;i++)
printf("&c[%d]=%d\n",i,&c);
for(i=0;i<6;i++)
printf("&a[%d]=%d\n",i,&a);
c='\0';
return ;
}
int main(void){
int i;
char c[256],h[/url]="Hello";
st(c,h);
printf("%s\n",c);
return 0;
}
実行結果
・・(略
&c[251]=1242047
&c[252]=1242048
&c[253]=1242049
&c[254]=1242050
&c[255]=1242051
&a[0]=1242052
&a[1]=1242053
&a[2]=1242054
&a[3]=1242055
&a[4]=1242056
&a[5]=1242057
Hello
Re:文字列コピー
Posted: 2007年3月06日(火) 01:17
by フグオ
できました。
ありがとうございました!
ところで最初のプログラムの256回目でbreakする理由ですが、
偶然にa[256]に0が入っていたってことですかね?
Re:文字列コピー
Posted: 2007年3月06日(火) 18:46
by 管理人
そもそもaは6バイトしか用意していませんから7バイト目からこの時はずっと0だったのでしょう。
for文の継続可能条件が*aですからc[256]を書き換えた時a[0]が書き換わったのでループを抜けたと思われます。
Re:文字列コピー
Posted: 2007年3月07日(水) 17:20
by ふぐお
ごめんなさいよくわかりませんでした
こういうことではないのですか?
&c[256]==&a[0]で
c[256]=a[256]とゆうことは
a[0]==a[256]
ということでa[256]=0だったということではないのですか?
Re:文字列コピー
Posted: 2007年3月07日(水) 18:04
by keichan
その通りです。
a[256]が[color=#FF0000>たまたま[/color]0であったために、
a[0]=0になったということです。
Re:文字列コピー
Posted: 2007年3月07日(水) 20:41
by ふぐお
ありがとうございます!!
すっきりしました