0

C のいくつかのコードで問題が発生しています:

char opt, name[10], path[25];
printf("Things\nMore things\n");
printf("Even more things\n");
printf("\nChar: ");
scanf("\n%c",&opt);
printf("\nTask name: ");
scanf("%s",name);
printf("Name: %s\n", name);
printf("\nFolder name: ");
scanf("%s",path);
printf("Name: %s\n", name);
printf("Path: %s\n", path);

これは、「クリーン」モードで問題を起こすコードです。問題は、データのサイズが 10 または 25 より大きい場合、文字列を切り取るのではなく、「名前」と「パス」が混在することです。場合によっては、「パス」の一部を「名前」に入れています。これは未定義の動作ですか、それとも何か不足していますか?

4

7 に答える 7

2

ユーザー入力を正確な文字数に制限したい場合は、試してください

scanf("%24s",path);

char 配列のバッファオーバーロードを防ぐ必要があります。

于 2013-05-29T13:14:54.267 に答える
1

問題が発生したくない場合scanfは、文字列を次のように置き換えます。

fgets(name, 10, stdin);

ここで、2 番目の引数は配列のサイズです。そうすれば、さらに文字を書き込もうとしても無視されます。

于 2013-05-29T13:14:21.107 に答える
1

name に 10 文字以上、 に 25 文字以上を書き込もうとすると、バッファ オーバーランが発生しますpath

この特定のケースでは、namepathがスタックに割り当てられ、 のpath後にありnameます。ただし、スタックはトップダウンなので、さらにpath書き込むと、 のスペースに書き込むことができますname

ウィキペディアを読むバッファオーバーフロー

于 2013-05-29T13:13:13.270 に答える
1

scanf は変数のサイズを認識していません (特に文字列変数の場合)。バイトをメモリ空間に入れるだけで、オーバーフローがあるかどうかを自分で確認する必要があります。

データ構造のアラインメントによるセグメンテーション違反はありません。

于 2013-05-29T13:16:20.307 に答える
0

Name to Path はメモリ内のスペースを互いに近く占有するため、単純にオーバーロードされます。

于 2013-05-29T13:12:12.673 に答える
0

バッファ オーバーランを避けるために、scanf を使用する場合は、読み取る最大サイズを指定する必要があります。

scanf("%10s", name);
于 2013-05-29T13:15:51.050 に答える