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; }