方法1:使用 scanf 的返回值
scanf 函数会返回成功匹配和赋值的项数,如果输入的是数字,scanf 会返回 1(因为 %d 或 %lf 匹配了一个数字)。

(图片来源网络,侵删)
#include <stdio.h>
int main() {
int num;
printf("请输入一个整数: ");
if (scanf("%d", &num) == 1) {
printf("输入的是数字: %d\n", num);
} else {
printf("输入的不是数字!\n");
}
return 0;
}
缺点:
- 如果输入的是
123abc,scanf会读取123并返回1,但剩余的abc会留在输入缓冲区,可能影响后续输入。 - 如果输入的是
abc123,scanf会直接返回0,不会读取任何数据。
方法2:使用 fgets + strtol 或 strtod
更健壮的方法是先读取整行输入,再用 strtol(整数)或 strtod(浮点数)解析字符串。
示例1:判断整数
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int isInteger(const char *str) {
char *endptr;
strtol(str, &endptr, 10);
// 如果整个字符串都被转换(endptr指向字符串末尾),则返回1
return (*endptr == '\0');
}
int main() {
char input[100];
printf("请输入一个整数: ");
fgets(input, sizeof(input), stdin);
// 去掉末尾的换行符
input[strcspn(input, "\n")] = '\0';
if (isInteger(input)) {
printf("输入的是整数: %s\n", input);
} else {
printf("输入的不是整数!\n");
}
return 0;
}
示例2:判断浮点数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isDouble(const char *str) {
char *endptr;
strtod(str, &endptr);
return (*endptr == '\0');
}
int main() {
char input[100];
printf("请输入一个浮点数: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
if (isDouble(input)) {
printf("输入的是浮点数: %s\n", input);
} else {
printf("输入的不是浮点数!\n");
}
return 0;
}
优点:
- 可以正确处理
123、-456、14、-2.5e3等格式。 - 不会留下未处理的输入在缓冲区。
方法3:逐个字符检查
如果不想用 strtol 或 strtod,可以手动检查每个字符是否是数字(或允许 、、、e/E)。

(图片来源网络,侵删)
示例:判断整数
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int isInteger(const char *str) {
if (str == NULL || *str == '\0') {
return 0; // 空字符串不是数字
}
// 允许开头有 '+' 或 '-'
if (*str == '+' || *str == '-') {
str++;
}
// 检查剩余字符是否都是数字
while (*str != '\0') {
if (!isdigit(*str)) {
return 0;
}
str++;
}
return 1;
}
int main() {
char input[100];
printf("请输入一个整数: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
if (isInteger(input)) {
printf("输入的是整数: %s\n", input);
} else {
printf("输入的不是整数!\n");
}
return 0;
}
缺点:
- 需要手动处理 、、、
e/E等情况,代码较复杂。 - 对于浮点数,需要额外检查小数点和指数部分。
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
scanf |
简单输入 | 代码简单 | 可能残留输入缓冲区 |
fgets + strtol/strtod |
健壮的数字判断 | 正确处理各种格式 | 需要额外函数 |
| 逐个字符检查 | 自定义格式 | 完全可控 | 代码复杂 |
推荐方法:
- 如果只是简单判断,用
scanf。 - 如果需要健壮性,用
fgets+strtol/strtod。 - 如果需要完全自定义格式(如只允许特定字符),用逐个字符检查。
希望这些方法能帮到你!如果有更具体的需求,可以进一步优化代码。

(图片来源网络,侵删)
