#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' ...
となると思うんだけど、この考えは合っていますか?
No.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'
No.2
- 回答日時:
for文の初期化でp=&x[1]になっています。
1回目の*p=(char)(i+49)は
*p = '1' ;
↑x[1]と等価
ですね。
よって、1回目のstrcat()は
"a1cde"と"~"の連結です。
結果として"a1cde~"となり、御希望の結果は得られません。
当然、ループ中にxは29個では足りなくなり(元々足りませんが)「不正アクセス」で落ちるでしょう。
また、main()はint型の値を返すことが言語規約上決まっているのでvoidと宣言するのは間違いです。
No.1
- 回答日時:
なんか物凄いプログラムですね。
> 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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のfor文です。 繰り返しの...
-
charでの計算?
-
fgetsなどのときのstdinのバッ...
-
配列をnビットシフトする
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
文字列から空白を取り除きたい...
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
charからLPTSTRへの変換方法
-
C言語の入力した文字を反転させ...
-
”あいうえお” を ”おえういあ...
-
バイトスワップをやりたい
-
絶対パスからのファイル名の切...
-
c言語配列の結合についてです。...
-
「ポインタのポインタ」を使っ...
-
c++ 文字列を入力して、一文字...
-
全角文字を含んだ文字の並びを...
-
構造体の各メンバにfor文からア...
-
javaでunsignedは使えないので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
'const char *' 型は 'char *' ...
-
型変換
-
テキストデータをそのままバイ...
-
文字列から空白を取り除きたい...
-
CStringをwchar_tに変換したい
-
絶対パスからのファイル名の切...
-
fgetsなどのときのstdinのバッ...
-
ネットワークにつながっている...
-
str系関数を使わずに二つの文字...
-
3桁区切(コンマ)記号をつけ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語のfor文です。 繰り返しの...
-
switch文で文字を比較すること...
-
ファイル名である文字列からbas...
-
c++ 文字列を入力して、一文字...
-
strncpyと_tcsncpy_sのヌルの扱...
おすすめ情報