私は、C++ で柔軟なコマンド ライン (ただし長くはない!) のダイアモンド スクエア ジェネレーターを作成しています。ユーザー入力の半分を書き終えました。ただし、最後のコマンドでは、入力が「スリップ」し、改行が getchar() に自動的に入力されます。何らかのオーバーフローが発生しないように予防措置を講じました。つまり、stdin と、適切な方法として stdout の両方をフラッシュします。問題は解決しません。これが私のコードです:
#include <stdio.h>
#include <stdlib.h>
int main () {
unsigned long seed = 0, x = 0, y = 0, initial = 0, range = 0;
int smooth = 0, fail = 1;
char flagchar1 = 'n';
printf("Welcome to my diamond-square generator! This isn't full-feature yet, so I'm just gonna have you input the variables one by one. ");
do {
printf("Please input the seed (this is a positive integer):\n");
fail = scanf("%lu", &seed);
while (fail == 0) {
printf("Try again, smartass.\n");
fail = scanf("%lu", &seed);
}
fail = 1;
printf("Now input the x, or horizontal, size of your grid:\n");
fail = scanf("%lu", &x);
while (fail == 0) {
printf("An integer. Not a string. An integer. You can do that, can't you?\n");
fail = scanf("%lu", &x);
}
fail = 1;
printf("Now input the y, or vertical, size of your grid:\n");
fail = scanf("%lu", &y);
while (fail == 0) {
printf("What was that supposed to be? An integer, please.\n");
fail = scanf("%lu", &y);
}
fail = 1;
printf("Now input about how high you'd like the grid to be (this goes from a scale of 1 to 256):\n");
fail = scanf("%lu", &initial);
while (initial == 0 || initial > 256 || fail == 0) {
printf("ahahahahaha how HIGH do you have to be just to HAVE that hieght........\n");
fail = scanf("%lu", &initial);
}
fail = 1;
printf("Now input the range of the heights on your grid (this must be equal to or less than 256):\n");
scanf("%lu", &range);
while (range >= 256 || fail == 0) {
printf("What did I say about being equal to or less than 256? Give me something reasonable to work with here.\n");
fail = scanf("%lu", &range);
}
fail = 1;
printf("Just one more variable to go! Now, I need you to input the smoothness of your grid. Smaller numbers make spikier grids. You can make this negative, but beware!\n");
fail = scanf("%d", &smooth);
while (fail == 0) {
printf("That... was not a number.\n");
fail = scanf("%d", &smooth);
}
fail = 1;
printf("\nOkay. Are these the values you want?\n Seed: %lu\n Width: %lu\n Length: %lu\n Height: %lu\n Range: %lu\n Smoothness: %d\nDo you want to keep these? Type Y/n.\n", seed, x, y, initial, range, smooth);
fflush(stdin);
fflush(stdout);
flagchar1 = getchar();
} while (flagchar1 != 'y' && flagchar1 != 'Y' && flagchar1 != '\n');
}
これが私の出力であり、プログラムは終了しています(&& flagchar1 != '\n'
fromを削除すると、プログラムは do-while ループ全体を繰り返すだけですwhile()
):
私のダイアモンド スクエア ジェネレーターへようこそ! これはまだフル機能ではないので、変数を 1 つずつ入力してもらいます。シードを入力してください (これは正の整数です): 12345678 次に、グリッドの x (水平) サイズを入力します。 40 次に、グリッドの y (垂直) サイズを入力します。 30 次に、グリッドの高さを入力します (これは 1 から 256 のスケールになります)。 1288 ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ! 128 次に、グリッドの高さの範囲を入力します (これは 256 以下である必要があります)。 30 残りの変数はあと 1 つです。ここで、グリッドの滑らかさを入力する必要があります。数値が小さいほど、より尖ったグリッドになります。これを否定的にすることもできますが、注意してください! 10 わかった。これらはあなたが望む値ですか? 種: 12345678 幅: 40 長さ: 30 身長:128 範囲: 30 滑らかさ: 10 これらを保持しますか?Y/n と入力します。
何が起こっていますか? どうすれば修正できますか?
PS 入力検証が本質的に役に立たないことはわかっています。これに関するヘルプも大歓迎です。