文字列コピー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ふぐお

文字列コピー

#1

投稿記事 by ふぐお » 18年前

文字列をコピーするプログラムです。
<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:文字列コピー

#2

投稿記事 by ふぐお » 18年前

すいません
c[i1]='\0';は
c[/url]i='\0';です

管理人

Re:文字列コピー

#3

投稿記事 by 管理人 » 18年前

>c[/url]i='\0';です

ということですが、このような書き方は出来ません、どのようなことがここでさせたいのでしょうか?
格納した文字列の最後に終端記号を入れたいのでしょうか?
それでしたら
cにいれないといけませんが。


そこを直せば後は悪くないはずです。
なお、タグは
<per>ではなく、<pre>です。

box

Re:文字列コピー

#4

投稿記事 by box » 18年前

> for(i=0;*(a);i++){

*(a) が正しくありません。
*(a) もしくは *a は、aが指している1文字のことです。
それが '\0' でない間ループを回り続けますので、
状況によっては無限ループに陥ってしまうと思います。

*(a)
のかわりに
a != '\0'
と書けば、うまくいくと思います。

管理人

Re:文字列コピー

#5

投稿記事 by 管理人 » 18年前

あら、そのように書かれていたとは、すみません^^;

しかし無限ループにはならず、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:文字列コピー

#6

投稿記事 by 管理人 » 18年前

やはりそのようです。

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:文字列コピー

#7

投稿記事 by フグオ » 18年前

できました。
ありがとうございました!
ところで最初のプログラムの256回目でbreakする理由ですが、
偶然にa[256]に0が入っていたってことですかね?

管理人

Re:文字列コピー

#8

投稿記事 by 管理人 » 18年前

そもそもaは6バイトしか用意していませんから7バイト目からこの時はずっと0だったのでしょう。
for文の継続可能条件が*aですからc[256]を書き換えた時a[0]が書き換わったのでループを抜けたと思われます。

ふぐお

Re:文字列コピー

#9

投稿記事 by ふぐお » 18年前

ごめんなさいよくわかりませんでした

こういうことではないのですか?
&c[256]==&a[0]で
   
c[256]=a[256]とゆうことは
   
a[0]==a[256]
ということでa[256]=0だったということではないのですか?

keichan

Re:文字列コピー

#10

投稿記事 by keichan » 18年前

その通りです。
a[256]が[color=#FF0000>たまたま[/color]0であったために、
a[0]=0になったということです。

ふぐお

Re:文字列コピー

#11

投稿記事 by ふぐお » 18年前

ありがとうございます!!
すっきりしました

閉鎖

“C言語何でも質問掲示板” へ戻る