當我運行這段代碼:沖洗標準輸入(消耗整個文本,並繼續在多被粘貼)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
static void flush_stdin(void)
{
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF);
}
static int scand(int *val, int min, int max)
{
char s[32], *p = NULL;
long x = 0;
if (fgets(s, sizeof s, stdin)) {
x = strtol(s, &p, 10);
if (strchr(p, '\n') == NULL) flush_stdin();
}
if (p == NULL || *p != '\n' || x < min || x > max) {
*val = 0;
return 0;
} else {
*val = (int)x;
return 1;
}
}
int main(void)
{
int x;
do {
printf("Number (1-10): \n");
} while (scand(&x, 1, 10) == 0);
printf("Number = %d\n", x);
return 0;
}
我粘貼以下文字:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
我給這個輸出:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Number (1-10):
Number (1-10):
Number (1-10):
printf("Number (1-10): \n");
爲每行粘貼處理。
在返回scand()
之前可以吃掉(沖洗)整個文本,以便僅處理一個printf
?
@ahnlak然後你必須等待EOF'ctrl + D'或'Ctrl + Z' – P0W
你是對的,當然 - 我的不好,我是在原始模式方面思考的。 – ahnlak
@ahnlak,'while((c = fgetc(stdin))!='\ n'&& c!= EOF);' –