1、使用 fgets 和 sscanf
fgets
用于读取整行输入,并且能更好地控制缓冲区大小和输入格式。然后可以使用 sscanf
将读取的字符串转换成其他类型的数据。
#include <stdio.h>
int main() {
char input[100];
int number;
// 使用 fgets 获取整行输入
printf("请输入一个整数: ");
if (fgets(input, sizeof(input), stdin)) {
// 使用 sscanf 转换输入
if (sscanf(input, "%d", &number) != 1) {
printf("输入无效!\n");
} else {
printf("您输入的数字是: %d\n", number);
}
}
return 0;
}
2、使用 getline (GNU 扩展)
getline
是 GNU 提供的一个更安全的输入函数,它可以动态调整缓冲区大小以适应用户输入。
#include <stdio.h>
#include <stdlib.h>
int main() {
char *line = NULL;
size_t len = 0;
ssize_t nread;
int number;
printf("请输入一个整数: ");
// 使用 getline 获取整行输入
nread = getline(&line, &len, stdin);
if (nread == -1) {
printf("读取输入失败!\n");
free(line);
return 1;
}
// 使用 sscanf 转换输入
if (sscanf(line, "%d", &number) != 1) {
printf("输入无效!\n");
} else {
printf("您输入的数字是: %d\n", number);
}
free(line);
return 0;
}
3、使用 getchar (逐个字符输入)
如需要逐个字符处理输入,getchar
可以逐字符读取用户输入并进行处理。
#include <stdio.h>
int main() {
int number = 0;
char ch;
printf("请输入一个整数: ");
// 使用 getchar 逐字符读取输入
while ((ch = getchar()) != '\n' && ch != EOF) {
// 逐字符处理
if (ch >= '0' && ch <= '9') {
number = number * 10 + (ch - '0');
} else {
printf("输入无效!\n");
return 1;
}
}
printf("您输入的数字是: %d\n", number);
return 0;
}
4、使用 scanf 的替代方法(手动清除缓冲区)
如仍然希望使用 scanf
,可以在输入之后使用 fflush
(stdin) 来清除缓冲区,尽管这并不被所有编译器支持。
#include <stdio.h>
int main() {
int number;
printf("请输入一个整数: ");
if (scanf("%d", &number) != 1) {
printf("输入无效!\n");
fflush(stdin); // 清除缓冲区(仅某些编译器支持)
} else {
printf("您输入的数字是: %d\n", number);
}
return 0;
}