1、使用 scanf
scanf
是一个常用的读取格式化输入的函数,但它有一些限制和风险,特别是在处理字符串或格式不正确的用户输入时。
当读取字符串时,始终使用宽度限定符来防止缓冲区溢出。
#include <stdio.h>
int main() {
char buf[100];
// 使用 scanf 读取字符串,确保最多读取 99 个字符
printf("请输入一个字符串(最多99个字符):");
scanf("%99s", buf); // 确保不会读取超过99个字符
printf("您输入的字符串是:%s\n", buf);
return 0;
}
2、使用 fgets
读取字符串输入
fgets
是读取字符串时比 scanf
更安全的选择。它允许你指定最大读取的字符数,从而防止缓冲区溢出。
#include <stdio.h>
int main() {
char buf[100];
printf("请输入一段文本:");
fgets(buf, sizeof(buf), stdin); // 最多读取 99 个字符 + 1 个空字符(\0)
// 输出用户输入的内容
printf("您输入的内容是:%s", buf);
return 0;
}
3、使用 getchar()
读取单个字符
如果只需要读取一个字符,getchar()
是一个简单且安全的选择。它每次从 stdin
读取一个字符。
#include <stdio.h>
int main() {
char c;
// 提示用户输入字符
printf("请输入一个字符: ");
// 使用 getchar() 读取用户输入的字符
c = getchar();
// 输出读取到的字符
printf("你输入的字符是: %c\n", c);
return 0;
}
4、解析整数和其他数据类型
对于读取整数、浮点数或其他数据类型,scanf
可以使用,但应始终检查错误并小心处理无效输入。
#include <stdio.h>
int main() {
int x;
// 提示用户输入一个整数
printf("请输入一个整数:");
// 使用scanf读取用户输入的整数
if (scanf("%d", &x) != 1) {
// 如果输入不合法(不是整数),输出错误提示
printf("无效的输入\n");
} else {
// 如果输入合法,输出输入的整数
printf("你输入的整数是:%d\n", x);
}
return 0;
}
5、使用 strtol
/ strtod
进行强健的解析
对于数字解析,strtol
(解析整数)或 strtod
(解析浮点数)提供了更好的错误处理和控制。
#include <stdio.h>
#include <stdlib.h>
int main() {
char buf[100];
char *endptr;
long num;
// 获取用户输入
printf("请输入一个数字:");
fgets(buf, sizeof(buf), stdin);
// 将字符串转换为长整型数字
num = strtol(buf, &endptr, 10);
// 检查转换是否成功
if (*endptr != '\0' && *endptr != '\n') {
printf("无效的输入:不是一个数字\n");
} else {
printf("输入的数字是:%ld\n", num);
}
return 0;
}
6、处理多个输入和输入验证
在读取多个输入或处理复杂的输入格式时,重要的是要小心管理输入缓冲区并验证每个数据项,以确保正确的解析。
#include <stdio.h>
int main() {
int x, y;
// 提示用户输入两个整数
printf("请输入两个整数:");
if (scanf("%d %d", &x, &y) != 2) {
// 如果输入无效,打印错误消息
printf("两个整数的输入无效\n");
} else {
// 如果输入有效,打印输入的整数
printf("你输入的整数是:x = %d, y = %d\n", x, y);
}
return 0;
}