#include <iostream.h>
void main(){
char x[29]="abcde";
char* y="~";
for(char *p=x+1, i=0; i<15; i++,p+=2) {
*p=(char)(i+49); // x[奇数] に数字文字を入れる
strcat(p,y); // 数字文字の後ろにチルダを付ける
}
cout << x << endl << x[29] << endl << x[30];
}

↓出力結果
-------------------------------------
a1~2~3~4~5~6~7~8~9~:~;~<~=~>~?~
?
~
-------------------------------------

1回目に動作する strcat(p,y) の処理を教えてください。
strcat(p,y) の処理をされる前は、
x[0]='a' x[1]='b' x[2]='c' x[3]='d' x[4]='e' ...
となっていると思います。
1回目の strcat(p,y) で、x[1]='b' x[2]='~' x[3]='\0' x[4]='e' ...
となると思うんだけど、この考えは合っていますか?

A 回答 (3件)

初回strcatまでの流れはこんな感じです。



char x[29]="abcde";
 ↓
x[0]='a' x[1]='b' x[2]='c' x[3]='d' x[4]='e' x[5]='\0'

*p=(char)(i+49);
 ↓
x[0]='a' x[1]='1' x[2]='c' x[3]='d' x[4]='e' x[5]='\0'

strcat(p,y); 
 ↓
x[0]='a' x[1]='1' x[2]='c' x[3]='d' x[4]='e' x[5]='~' x[6]='\0'
    • good
    • 0
この回答へのお礼

zonbieさんありがとう。
またお世話になりました。

お礼日時:2001/03/24 23:47

for文の初期化でp=&x[1]になっています。


1回目の*p=(char)(i+49)は
*p = '1' ;
↑x[1]と等価
ですね。

よって、1回目のstrcat()は
"a1cde"と"~"の連結です。
結果として"a1cde~"となり、御希望の結果は得られません。
当然、ループ中にxは29個では足りなくなり(元々足りませんが)「不正アクセス」で落ちるでしょう。

また、main()はint型の値を返すことが言語規約上決まっているのでvoidと宣言するのは間違いです。
    • good
    • 0

なんか物凄いプログラムですね。



> 1回目の strcat(p,y) で、x[1]='b' x[2]='~' x[3]='\0' x[4]='e' ...
> となると思うんだけど、この考えは合っていますか?

1回目は p が z+1 されていますから、

x[0]='a'
x[1]='1'←ここに "=(char)(i+49)" このコードが入る
x[2]='c'
x[3]='d'
x[4]='e'
x[5]='~'
x[6]=0

ですね。
strcat() は文字列の一番後ろに文字列を加える関数です。

なので strcat() を使わずに、

for(char *p=x+1, i=0; i<15; i++,p+=2) {
p[0]=(char)(i+49);
p[1]=(char)'~';
}

です(下記)。

x[0]='a'
x[1]='1'
x[2]='~'
x[3]='d'
x[4]='e'
x[5]=0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング