- ベストアンサー
defineで範囲指定した文字配列について
こんにちは。C言語初心者です。 文字の配列で下のようなプログラムを作ったとき、入力の際にdefineで指定したN以上の文字数の文字列を入力した場合、その後のプログラム次第で実行が正しかったり、セグメントエラーがでたりします。 コンパイルする際はエラーがでません。 ※その後のプログラムとは、関数strcmpやstrcpyです。 #include <stdio.h> #define N 10 main() { char a[N]; char b[N]; scanf("%s %s", a, b); printf("%s\n", a); printf("%s\n", b); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
っていうか、バッファをオーバーしているので当然だと思うのですが 何を質問したいのでしょうか。 書いていることだけでは質問したいことの要点が分かりません。 #define N 10 はそれより下に現れる N という定数を 10 という定数で置き換えると いう意味です。 つまり > char a[N]; > char b[N]; これは char a[10]; char b[10]; と書いているのと全く同じです。 (コンパイルの前のプリプロセスで上記の変換が行われるため、 コンパイラは上記のコードとしてコンパイルします) なので、 #define の問題ではなく、単にバッファがあふれているのが 問題です。
その他の回答 (4)
- yaemon_2006
- ベストアンサー率22% (50/220)
細かいけど、はまると痛いので一応突っ込んどくと、 #define N 10 はそれより下に現れる N という"文字列"を 10 という"文字列"で置き換えると いう意味です。
- mk48a
- ベストアンサー率56% (1133/2007)
多分9文字以上(終端文字があるので)の文字列を配列に入れているからでしょう。 Nの値を大きくするか、#1さんのように、文字数を指定する関数を使うのが良いと思います。
- asuncion
- ベストアンサー率33% (2127/6289)
> その後のプログラム次第で > ※その後のプログラムとは、関数strcmpやstrcpyです。 だとするならば、strcmp()やstrcpy()を含めたソース全体を載せるのが筋だとは思いませんか? つまり、今回提示されたコードでは、 > 実行が正しかったり、セグメントエラーがでたりします。 という点がわからないのです。 言っていることが理解できますか?
- koko_u_
- ベストアンサー率18% (459/2509)
>※その後のプログラムとは、関数strcmpやstrcpyです。 strncmp() や strncpy() を使って下さい。