VS Code中替代CS50.h实现标准C用户输入及scanf/printf详解
用标准C替代CS50的
get_int函数 CS50的get_int是封装了输入验证和缓冲区处理的便捷函数,在标准C中可以通过scanf配合循环逻辑实现相同效果,同时完成输入合法性校验。
以下是模拟get_int("height")的示例(包含范围校验,对应CS50第一周的Mario问题场景):
#include <stdio.h> int main(void) { int height; // 循环直到获取有效整数 printf("height: "); while (scanf("%d", &height) != 1) { // 清理缓冲区中的无效输入(避免死循环) while (getchar() != '\n'); printf("Invalid input. Please enter an integer: "); } // 额外添加范围校验(符合CS50作业要求) while (height < 1 || height > 8) { printf("Height must be between 1 and 8. Try again: "); // 再次处理非整数输入 while (scanf("%d", &height) != 1) { while (getchar() != '\n'); printf("Invalid input. Enter an integer between 1 and 8: "); } } printf("You entered: %d\n", height); return 0; }
printf() 详细用法 printf用于格式化输出数据到控制台,核心是格式化字符串中的占位符匹配参数类型。
基本语法
printf("格式化字符串", 参数1, 参数2, ...);
常用占位符
%d/%i:输出十进制整数(对应int类型)%f:输出浮点数(float/double,默认保留6位小数)%lf:专门用于输出double类型(部分编译器中%f也兼容,但%lf更严谨)%c:输出单个字符%s:输出字符串(自动识别\0结束符)%x/%X:输出十六进制整数(小写/大写)%%:输出百分号本身(避免被解析为占位符)
格式修饰符(控制输出样式)
- 宽度控制:
%5d表示输出占5个字符宽度,默认右对齐;%-5d改为左对齐 - 小数位数控制:
%.2f保留2位小数,%10.2f同时指定10字符宽度+2位小数 - 填充字符:
%05d用0填充空位,输出如00042
示例代码
int num = 42; double pi = 3.1415926; char initial = 'M'; char course[] = "CS50"; printf("Decimal integer: %d\n", num); printf("2-decimal float: %.2f\n", pi); printf("Left-aligned int: %-5d\n", num); printf("Hex (uppercase): %X\n", num); // 输出2A printf("Character: %c\n", initial); printf("String: %s\n", course); printf("Percent sign: %%\n");
scanf() 详细用法 scanf用于从控制台读取格式化输入,核心是占位符匹配变量类型,且普通变量必须加取地址符&(数组名无需加,因为数组名本身是地址)。
基本语法
scanf("格式化字符串", &变量1, &变量2, ...);
常用占位符
%d:读取十进制整数,存入int变量%f:读取浮点数,存入float变量;%lf存入double变量%c:读取单个字符(注意:会读取空格、换行符等空白字符)%s:读取字符串(直到遇到空白字符停止,自动添加\0结束符)
返回值关键
scanf返回成功读取的变量个数:
- 成功读取1个变量返回1,成功读取2个返回2,以此类推
- 输入不匹配(比如输入字符串给
%d)返回0 - 遇到文件结束符(EOF)返回
EOF(通常为-1)
常见注意事项
- 处理空白字符:如果前面用
scanf读取过整数/字符串,缓冲区会残留换行符,后续用%c会读取到换行。解决方法是在%c前加空格:scanf(" %c", &c)(空格会跳过所有空白字符) - 缓冲区清理:当输入不匹配时,无效字符会留在缓冲区,导致后续
scanf持续失败。需用while(getchar() != '\n');清空缓冲区 - 字符串读取限制:
%s无法读取带空格的字符串,如需读取整行(含空格),建议使用fgets()
示例代码
int age; double salary; char gender; char username[30]; printf("Enter your age: "); scanf("%d", &age); printf("Enter your monthly salary: "); scanf("%lf", &salary); // 加空格跳过前面的换行符 printf("Enter your gender (M/F): "); scanf(" %c", &gender); printf("Enter your username (no spaces): "); scanf("%s", username); // 数组名无需加& printf("Age: %d, Salary: %.2f, Gender: %c, Username: %s\n", age, salary, gender, username);
内容的提问来源于stack exchange,提问作者Carter Markham
相关产品推荐
相关产品推荐

