我一直在寻找几个小时,似乎无法找到我之后的答案。如果这最终成为重复,我道歉。
现在我的程序要求用户输入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个值。 很多帮助将不胜感激。
让我走到这一步的参考资料:
答案 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
。