解析两个值的用户输入

时间:2016-08-17 11:56:36

标签: c validation input

我一直在寻找几个小时,似乎无法找到我之后的答案。如果这最终成为重复,我道歉。

现在我的程序要求用户输入2个整数。实施例

SELECT ACOL,
       COUNT(CASE WHEN AGE >= 1000 AND AGE < 2000 THEN AGE ELSE NULL END) AS `1000-2000`,
       COUNT(CASE WHEN AGE >= 2000 AGE < 3000  THEN AGE ELSE NULL END) AS `2000-3000`,
       COUNT(CASE WHEN AGE >= 3000 AND AGE < 4000 THEN AGE ELSE NULL END) AS `3000-4000`
FROM (select ACOL,DATEDIFF(hour,CONVERT(DATEADD('SECOND', (epoch_time)/1000, DATE '1970-01-01'), DATE), CURRENT_TIMESTAMP()) AS AGE FROM test_table )
GROUP BY ACOL

我在提出其他问题之后,人们提到了Prompt: 15 24 scanf。但是每一个都是一次输入一个数字,而我想从一个输入中得到两个数字。

我的另一个问题是错误检查。他们是否实际输入了一个整数或无效的东西。例如:

fgets

代码:

Prompt: Hello World
Prompt: foo 5
Prompt: 4 bar
Prompt: foo
Prompt: 

缺少一些错误检查,但是如果有的话,只是真的停留在第二个值上。还要检查是否有超过2个值。 很多帮助将不胜感激。

让我走到这一步的参考资料:

SO Question

strtol doc

2 个答案:

答案 0 :(得分:0)

我最终提出的内容,也适用于可变数量的值。

bool get_input(int count, int* ref_values) {
    char buffer[MAX_LINE_LENGTH];
    char* input = fgets(buffer, sizeof(buffer), stdin);
    char* end;
    int i = 0;

    if (feof(stdin)) {
        clearerr(stdin);
        return false;
    }

    for (long val = strtol(input, &end, 10); input != end && i < count; val = strtol(input, &end, 10), i++) {
        input = end;
        if (errno == ERANGE) {
            errno = 0;
            return false;
        }

        if (val <= INT_MIN || val >= INT_MAX) {
            return false;
        }
        ref_values[i] = val;
    }
    return i == count && strlen(input) == 1;
}

int main(int argc, char** argv) {
    while (true) {
        int values[2] = {};
        printf("Enter 2 numbers: ");
        if (get_input(2, values)) {
            printf("You entered %d %d %d\n", values[0], values[1]);
        } else {
            printf("Invalid\n");
        }
    }
    return 0;
}

答案 1 :(得分:-1)

在字符串中输入后,您可以正常使用sscanf,但最后使用技巧参数:

int get_input(int* x, int* y) {

    char* p, buf[LINE_MAX], buf2[LINE_MAX];
    int n1, n2;

    printf("Prompt: ");
    fgets(buf, sizeof(buf), stdin);
    if  (sscanf(buf, "%d%d%s", &n1, &n2, buf2) == 2) {
        /* Success */
        *x = n1;
        *y = n2;
        return 1;
    }
    /* Failure */
    return 0;
}

注意:

第三个参数(buf2)是在第二个整数之后防止无效输入。这个技巧有效,因为您首先将输入读入字符串。如果您尝试直接执行scanf("%d%d%s", ...),则系统会提示用户进一步输入,直到他提供一些非空格进入buf2