核心输入函数
-
scanf()
:格式化输入- 基础用法:
int num; printf("输入整数:"); scanf("%d", &num); // &num表示变量地址
- 多数据输入:
float f; char str[20]; scanf("%f %s", &f, str); // 空格分隔输入
- 安全限制:防止缓冲区溢出
char safe_str[10]; scanf("%9s", safe_str); // 限制最多读取9字符
- 基础用法:
-
fgets()
:安全读取字符串- 替代危险的
gets()
函数:char buffer[50]; printf("输入字符串:"); fgets(buffer, sizeof(buffer), stdin); // 读取一行,包括换行符
- 移除末尾换行符:
buffer[strcspn(buffer, "\n")] = '\0'; // 查找并替换换行符
- 替代危险的
-
getchar()
:单字符输入- 基础用法:
printf("输入字符:"); char ch = getchar(); // 读取单个字符
- 清空输入缓冲区:
while ((ch = getchar()) != '\n' && ch != EOF); // 丢弃残留字符
- 基础用法:
完整输入流程示例
int main() {
int age;
char name[30];
// 输入整数
printf("请输入年龄:");
scanf("%d", &age);
getchar(); // 吸收回车
// 输入字符串
printf("请输入姓名:");
fgets(name, sizeof(name), stdin);
name[strcspn(name, "\n")] = '\0'; // 删除换行符
// 输出结果
printf("\n姓名:%s \n年龄:%d\n", name, age);
return 0;
}
关键注意事项
- 地址传递:
scanf()
必须用&
获取变量地址(字符串数组除外)。 - 缓冲区溢出:
- 避免使用
gets()
(已被C11标准废弃)。 - 用
fgets()
替代,并指定最大长度。
- 避免使用
- 输入残留:
- 混合使用
scanf
和fgets
时,用getchar()
清空缓冲区。
- 混合使用
- 错误处理:
if (scanf("%d", &num) != 1) { printf("输入错误!"); while (getchar() != '\n'); // 清空错误输入 }
常见问题解决
-
Q:输入字符串包含空格?
A:用fgets()
代替scanf("%s")
(后者遇到空格停止)。 -
Q:数字和字符串混合输入出错?
A:在scanf
后添加while (getchar() != '\n');
清除缓冲区。 -
Q:跨平台换行符差异?
A:Windows换行符为\r\n
,Linux/macOS为\n
,fgets()
会统一读取。
最佳实践建议
- 优先使用
fgets()
读取字符串,再通过sscanf()
解析数据。 - 对用户输入进行验证(如检查数字范围)。
- 关键程序添加错误处理逻辑。
引用说明:本文内容参考C99/C11标准文档及《C Primer Plus》权威教材,遵循C语言标准库规范,安全输入方法依据CERT C安全编码标准。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5743.html