アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語について質問お願いします

まだ勉強中なのでご指導よろしくお願いします

str1=big
str2=city
str3=bigcity

という結果にしたいのですが下のような結果になり困っております(´;Д;`)

もっといい書き方もあるかもしれませんが、今書いてあるコードを活かして訂正して結果通りになるにはどうすればいいでしょうか?!

その他アドバイスありましたら先輩方よろしくお願いしますm(_ _)m

「C言語について質問お願いします まだ勉強」の質問画像

A 回答 (3件)

C言語で配列を扱うときの基本ですが


「添字の範囲を間違えても、エラーになるとは限らない」
というのがあります。

char str1[]={"big"},str2[]={"city"}, str3[]={0};

これは、配列の要素数をコンパイラが自動で判定するものです。

char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};

と同じになります。
str3配列の内容が 「0」という値が1つあるだけですから、要素数は1です。

この後、str3[1],str3[2],... へ(ポインタcを通して)書き込んでいます。
str3 では宣言されていない場所です。
このような場合、C言語では、指定したとおり(無いはずの)str3[1]str3[2]へ書き込みます。
そうなったとき、どんなことが起こるかは、わかりません。
エラーになるかもしれないし、たまたまうまく動作するように見えるかもしれません。

今回は、そのはみ出した場所がstr2やstr1が使っている領域だったので、str1,str2の内容が変わってしまった、ということでしょう
    • good
    • 0
この回答へのお礼

回答ありがとうございますm(_ _)m

こちら初心者のため何処を書き換えたらいいのかも一緒に教えて頂けましたらありがたいです!!
よろしくお願いしますm(_ _)m

お礼日時:2017/08/27 20:59

#include <stdio.h>


int main(void){
char str1[]={"big"},str2[]={"city"},str3[]={"bigcity"};
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
printf("str3=%s\n",str3);
return 0;
}
------------------------
以下、実行結果です。
str1=big
str2=city
str3=bigcity
    • good
    • 0

一つ訂正します


誤) char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
正) char str1[4]={"big"},str2[5]={"city"}, str3[1]={0};

ベテランでもこういう単純な間違いをすることがあります。
間違えもいいんです。それに気付いて直せれば。

ダメなときは、どこでダメになっているかを調べ、何故ダメになるかを調べ、どうすればダメじゃなくなるかを考えます。
これはベテランでも初心者でも変わりません。



原因は str3[1],str3[2] ...と範囲外に書き込んだことです。
例えるなら、「子供に紙とクレヨン渡したら、調子にのって床にまで絵を描いてしまった」状態です。
よって、対策は
・これらに書きこまないようにする。つまり、配列に収まる大きさの文字列にする
 (例えるなら「紙の外に描かないような小さな絵にする」)
・これらが書き込まれても問題ない状態にする。つまり、配列の大きさを十分に大きくする
 (例えるなら「絵が入るくらいの大きな紙にする」)
のどちらか、となります。

今回の場合、書き込みたい文字列が決まっているので、前者の「収まる文字列にする」という方法は使えません。
よって、後者の「文字列が収まる配列にする」が正解になります。

配列の大きさの指定方法はわかりますね?
    • good
    • 1
この回答へのお礼

わかりやすい回答ありがとうございますm(__)m

初心者には大変わかりやすい例まで出して頂いてありがとうございましたm(_ _)m

お礼日時:2017/08/28 08:37

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