如果您真的想处理可能是敌对的用户输入,请使用单独的函数来获取数字。
允许
- 前导空格:“123”
- 尾随空格:“123”
- 前导零:“0000000000000000000000000000000000123”
- 错误输入后很好地重新扫描。
捕获以下错误
- 无输入:“”
- 数字后的额外文本:“123 abc”
- 数字前的文本:“abc 123”
- 拆分数字:“123 456”
- 上溢/下溢:“12345678901234567890”
- 其他: "--123"
重新提示无效输入。
#include <errno.h>
#include <stdio.h>
#include <stddef.h>
int GetInteger(const char *prompt, int *i) {
int Invalid = 0;
int EndIndex;
char buffer[100];
do {
if (Invalid)
fputs("Invalid input, try again.\n", stdout);
Invalid = 1;
fputs(prompt, stdout);
if (NULL == fgets(buffer, sizeof(buffer), stdin))
return 1;
errno = 0;
} while ((1 != sscanf(buffer, "%d %n", i, &EndIndex)) || buffer[EndIndex] || errno);
return 0;
}
int main() {
int a, b, c;
if (GetInteger("Enter first number to add\n", &a)) {
; // End of file or I/O error (rare)
}
if (GetInteger("Enter second number to add\n", &b)) {
; // End of file or I/O error (rare)
}
c = a + b;
printf("Sum of entered numbers = %d\n",c);
return 0;
}
顺便说一句,你不应该这样做printf("Enter first number to add\n")
。改为使用fputs()
。考虑一下如果字符串中有 a 会发生%
什么。