2

このコードを実行すると:

#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()1 つのprintf?

4

2 に答える 2

1

端末が非標準モードの場合fgetc、事前に読み取りおよび/または事前にread文字を読み取りNumber (1-10):、バッファーが空の場合にのみ出力するために使用できます。したがって、ユーザーがそれ以上の行を入力 (またはコピー&ペースト) していないことを確認できます。テキストの。

于 2013-08-29T15:37:05.523 に答える