• ベストアンサー

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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • pick52
  • ベストアンサー率35% (166/466)
回答No.4

っていうか、バッファをオーバーしているので当然だと思うのですが 何を質問したいのでしょうか。 書いていることだけでは質問したいことの要点が分かりません。 #define N 10 はそれより下に現れる N という定数を 10 という定数で置き換えると いう意味です。 つまり > char a[N]; >   char b[N]; これは char a[10];   char b[10]; と書いているのと全く同じです。 (コンパイルの前のプリプロセスで上記の変換が行われるため、 コンパイラは上記のコードとしてコンパイルします) なので、 #define の問題ではなく、単にバッファがあふれているのが 問題です。

その他の回答 (4)

回答No.5

   細かいけど、はまると痛いので一応突っ込んどくと、 #define N 10 はそれより下に現れる N という"文字列"を 10 という"文字列"で置き換えると いう意味です。

  • mk48a
  • ベストアンサー率56% (1133/2007)
回答No.3

多分9文字以上(終端文字があるので)の文字列を配列に入れているからでしょう。 Nの値を大きくするか、#1さんのように、文字数を指定する関数を使うのが良いと思います。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

> その後のプログラム次第で > ※その後のプログラムとは、関数strcmpやstrcpyです。 だとするならば、strcmp()やstrcpy()を含めたソース全体を載せるのが筋だとは思いませんか? つまり、今回提示されたコードでは、 > 実行が正しかったり、セグメントエラーがでたりします。 という点がわからないのです。 言っていることが理解できますか?

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>※その後のプログラムとは、関数strcmpやstrcpyです。 strncmp() や strncpy() を使って下さい。

関連するQ&A

専門家に質問してみよう