![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.3ベストアンサー
- 回答日時:
一つ訂正します
誤) char str1[4]={"big"},str2[4]={"city"}, str3[1]={0};
正) char str1[4]={"big"},str2[5]={"city"}, str3[1]={0};
ベテランでもこういう単純な間違いをすることがあります。
間違えもいいんです。それに気付いて直せれば。
ダメなときは、どこでダメになっているかを調べ、何故ダメになるかを調べ、どうすればダメじゃなくなるかを考えます。
これはベテランでも初心者でも変わりません。
原因は str3[1],str3[2] ...と範囲外に書き込んだことです。
例えるなら、「子供に紙とクレヨン渡したら、調子にのって床にまで絵を描いてしまった」状態です。
よって、対策は
・これらに書きこまないようにする。つまり、配列に収まる大きさの文字列にする
(例えるなら「紙の外に描かないような小さな絵にする」)
・これらが書き込まれても問題ない状態にする。つまり、配列の大きさを十分に大きくする
(例えるなら「絵が入るくらいの大きな紙にする」)
のどちらか、となります。
今回の場合、書き込みたい文字列が決まっているので、前者の「収まる文字列にする」という方法は使えません。
よって、後者の「文字列が収まる配列にする」が正解になります。
配列の大きさの指定方法はわかりますね?
この回答へのお礼
お礼日時:2017/08/28 08:37
わかりやすい回答ありがとうございますm(__)m
初心者には大変わかりやすい例まで出して頂いてありがとうございましたm(_ _)m
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.2
- 回答日時:
#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
No.1
- 回答日時:
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の内容が変わってしまった、ということでしょう
この回答へのお礼
お礼日時:2017/08/27 20:59
回答ありがとうございますm(_ _)m
こちら初心者のため何処を書き換えたらいいのかも一緒に教えて頂けましたらありがたいです!!
よろしくお願いしますm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の質問です HTMLでこのようなコードを書いたのですがそれをC言語で同じように書きたいです < 1 2022/08/11 23:38
- 放射線治療・リハビリテーション リハビリ系のお仕事についてです。 将来、リハビリ系のお仕事につきたいと思っているのですが PT、OT 1 2022/05/21 20:31
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード 3 2022/11/01 16:19
- C言語・C++・C# C言語の質問です、プログラミング初心者です このような文字列があった場合 "abcdef☆ghijk 4 2022/11/22 10:56
- 呼吸器・消化器・循環器の病気 健康診断結果について質問です。 今回、心電図で再検査となりました。 内容はST-T異常 のため、精密 1 2022/03/28 00:05
- Visual Basic(VBA) VBAで最新のデータを別シートに転記する方法をお教えください。 3 2022/04/07 19:20
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- 大学受験 高一文系です。先日、試しに2021年度共通テストの国語を解いてみました。結果157/200点でした。 1 2023/02/02 08:07
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列で格納したものをmsgboxで...
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
VB.NETでテキストボックスをコ...
-
C# Listを使わずに2次元配列の...
-
C言語でのカンマ区切りについて
-
VBで構造体の配列を関数に渡す...
-
unsigned char配列への入力の仕方
-
配列の参照渡しで型が一致しま...
-
プログラミングの課題で「5人分...
-
なぜ配列は0から始まるのです...
-
配列同士の文字列の比較
-
C# 配列の変数宣言について。
-
c言語の __FILE__ について
-
多次元配列の引渡しについて
-
簡易暗号化プログラム(文字入れ...
-
C言語 変換指定%sについてです。
-
プログラム
-
【VBS】 フォルダ直下のファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
unsigned char配列への入力の仕方
-
ExcelVBAで質問です。離れた二...
-
配列の参照渡しで型が一致しま...
-
パイソンの
-
C# Listを使わずに2次元配列の...
-
C言語で特定列だけを抽出して配...
-
複数の選択範囲の行番号を個別...
-
【C言語】配列の中に配列を入れ...
-
メモリの初期値
-
VBで構造体の配列を関数に渡す...
-
Excel、VBAのユーザーフォーム...
-
配列をEraseしてもメモリが開放...
-
2次元配列を戻り値とする関数?
-
【速いブラインドタッチ】手を...
おすすめ情報