プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。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);
}

A 回答 (5件)

>※その後のプログラムとは、関数strcmpやstrcpyです。



strncmp() や strncpy() を使って下さい。
    • good
    • 0

> その後のプログラム次第で


> ※その後のプログラムとは、関数strcmpやstrcpyです。

だとするならば、strcmp()やstrcpy()を含めたソース全体を載せるのが筋だとは思いませんか?
つまり、今回提示されたコードでは、

> 実行が正しかったり、セグメントエラーがでたりします。

という点がわからないのです。
言っていることが理解できますか?
    • good
    • 0

多分9文字以上(終端文字があるので)の文字列を配列に入れているからでしょう。


Nの値を大きくするか、#1さんのように、文字数を指定する関数を使うのが良いと思います。
    • good
    • 0

っていうか、バッファをオーバーしているので当然だと思うのですが


何を質問したいのでしょうか。

書いていることだけでは質問したいことの要点が分かりません。

#define N 10

はそれより下に現れる N という定数を 10 という定数で置き換えると
いう意味です。

つまり

> char a[N];
>   char b[N];

これは

char a[10];
  char b[10];

と書いているのと全く同じです。
(コンパイルの前のプリプロセスで上記の変換が行われるため、
コンパイラは上記のコードとしてコンパイルします)

なので、 #define の問題ではなく、単にバッファがあふれているのが
問題です。
    • good
    • 0

 


 細かいけど、はまると痛いので一応突っ込んどくと、

#define N 10

はそれより下に現れる N という"文字列"を 10 という"文字列"で置き換えると
いう意味です。
    • good
    • 0

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