You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

常见注意事项

  1. 处理空白字符:如果前面用scanf读取过整数/字符串,缓冲区会残留换行符,后续用%c会读取到换行。解决方法是在%c前加空格:scanf(" %c", &c)(空格会跳过所有空白字符)
  2. 缓冲区清理:当输入不匹配时,无效字符会留在缓冲区,导致后续scanf持续失败。需用while(getchar() != '\n');清空缓冲区
  3. 字符串读取限制:%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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:00:18