C语言快速入门教程
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
首页
入门指南
基础教程
进阶教程
实战案例
编程指南
  • 基础教程

    • Hello World 深入理解
    • 变量详解
    • 数据类型详解
    • 运算符详解
    • 输入输出详解
    • 条件判断 if-else
    • 循环语句
    • 函数详解
    • 数组详解

输入输出详解

学会输入输出,程序才能与用户交互!

输出函数 printf

基本格式化符号

格式符数据类型示例
%dintprintf("%d", 123)
%ldlongprintf("%ld", 123456L)
%uunsigned intprintf("%u", 123)
%ffloat/doubleprintf("%f", 3.14)
%ccharprintf("%c", 'A')
%s字符串printf("%s", "Hello")
%p指针printf("%p", &var)
%x十六进制printf("%x", 255)
%o八进制printf("%o", 8)

格式控制

#include <stdio.h>

int main() {
    int num = 42;
    float pi = 3.1415926;
    
    // 控制宽度
    printf("|%5d|\n", num);      // |   42|(右对齐,占5位)
    printf("|%-5d|\n", num);     // |42   |(左对齐,占5位)
    printf("|%05d|\n", num);     // |00042|(前面补0)
    
    // 控制小数位数
    printf("%.2f\n", pi);        // 3.14(2位小数)
    printf("%.4f\n", pi);        // 3.1416(4位小数)
    printf("%8.2f\n", pi);       // 3.14(总宽8,2位小数)
    
    return 0;
}

输入函数 scanf

基本用法

#include <stdio.h>

int main() {
    int age;
    
    printf("请输入你的年龄:");
    scanf("%d", &age);  // 注意&符号!
    
    printf("你的年龄是:%d\n", age);
    
    return 0;
}

重要提示

scanf 中的变量前必须加 &符号(取地址符)!

scanf("%d", &age);  // ✅ 正确
scanf("%d", age);   // ❌ 错误!

输入多个值

#include <stdio.h>

int main() {
    int age;
    float height;
    char grade;
    
    printf("请输入年龄、身高、等级(用空格分隔):");
    scanf("%d %f %c", &age, &height, &grade);
    
    printf("年龄:%d\n", age);
    printf("身高:%.2f\n", height);
    printf("等级:%c\n", grade);
    
    return 0;
}

输入字符串

#include <stdio.h>

int main() {
    char name[50];
    
    printf("请输入姓名:");
    scanf("%s", name);  // 字符串不需要&
    
    printf("你好,%s!\n", name);
    
    return 0;
}

scanf 的局限

scanf("%s") 遇到空格就停止:

输入:Zhang San
scanf只读取:Zhang

解决方法见后面的 fgets。

字符输入输出

getchar 和 putchar

#include <stdio.h>

int main() {
    char ch;
    
    printf("请输入一个字符:");
    ch = getchar();  // 获取一个字符
    
    printf("你输入的是:");
    putchar(ch);     // 输出一个字符
    putchar('\n');
    
    return 0;
}

读取整行 gets 和 fgets

#include <stdio.h>

int main() {
    char name[100];
    
    printf("请输入全名(可以有空格):");
    fgets(name, sizeof(name), stdin);
    
    printf("你好,%s", name);
    
    return 0;
}

fgets vs scanf

  • scanf("%s") - 不能读空格
  • fgets() - 可以读空格,更安全

实战案例

案例1:简单计算器

#include <stdio.h>

int main() {
    float num1, num2, result;
    char op;
    
    printf("=== 简易计算器 ===\n");
    printf("请输入表达式(如:5 + 3):");
    scanf("%f %c %f", &num1, &op, &num2);
    
    switch(op) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        case '*':
            result = num1 * num2;
            break;
        case '/':
            if (num2 != 0) {
                result = num1 / num2;
            } else {
                printf("错误:除数不能为0\n");
                return 1;
            }
            break;
        default:
            printf("错误:不支持的运算符\n");
            return 1;
    }
    
    printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
    
    return 0;
}

案例2:个人信息录入

#include <stdio.h>

int main() {
    char name[50];
    int age;
    float height, weight;
    char gender;
    
    printf("=== 个人信息录入系统 ===\n\n");
    
    printf("姓名:");
    fgets(name, sizeof(name), stdin);
    
    printf("年龄:");
    scanf("%d", &age);
    
    printf("性别(M/F):");
    scanf(" %c", &gender);  // 注意空格
    
    printf("身高(米):");
    scanf("%f", &height);
    
    printf("体重(千克):");
    scanf("%f", &weight);
    
    printf("\n=== 您的信息 ===\n");
    printf("姓名:%s", name);
    printf("年龄:%d岁\n", age);
    printf("性别:%c\n", gender);
    printf("身高:%.2f米\n", height);
    printf("体重:%.1f千克\n", weight);
    
    float bmi = weight / (height * height);
    printf("BMI:%.2f\n", bmi);
    
    return 0;
}

案例3:成绩管理

#include <stdio.h>

int main() {
    char name[50];
    int chinese, math, english;
    float average;
    
    printf("学生姓名:");
    scanf("%s", name);
    
    printf("语文成绩:");
    scanf("%d", &chinese);
    
    printf("数学成绩:");
    scanf("%d", &math);
    
    printf("英语成绩:");
    scanf("%d", &english);
    
    average = (chinese + math + english) / 3.0;
    
    printf("\n===== 成绩单 =====\n");
    printf("姓名:%s\n", name);
    printf("语文:%d\n", chinese);
    printf("数学:%d\n", math);
    printf("英语:%d\n", english);
    printf("平均分:%.2f\n", average);
    
    if (average >= 90) {
        printf("等级:优秀\n");
    } else if (average >= 80) {
        printf("等级:良好\n");
    } else if (average >= 60) {
        printf("等级:及格\n");
    } else {
        printf("等级:不及格\n");
    }
    
    return 0;
}

格式化输出技巧

对齐输出

#include <stdio.h>

int main() {
    printf("%-10s %-10s %-10s\n", "姓名", "年龄", "城市");
    printf("%-10s %-10d %-10s\n", "张三", 20, "北京");
    printf("%-10s %-10d %-10s\n", "李四", 22, "上海");
    printf("%-10s %-10d %-10s\n", "王五", 21, "广州");
    
    return 0;
}

输出:

姓名       年龄       城市      
张三       20         北京      
李四       22         上海      
王五       21         广州

常见问题

问题1:scanf缓冲区残留

int num;
char ch;

scanf("%d", &num);    // 输入:123[回车]
scanf("%c", &ch);     // ch读到了换行符!

// 解决方法1:清空缓冲区
scanf("%d", &num);
getchar();            // 吃掉换行符
scanf("%c", &ch);

// 解决方法2:格式字符串加空格
scanf("%d", &num);
scanf(" %c", &ch);    // 注意%c前有空格

问题2:输入验证

#include <stdio.h>

int main() {
    int age;
    int result;
    
    printf("请输入年龄:");
    result = scanf("%d", &age);
    
    if (result != 1) {
        printf("输入无效!\n");
        return 1;
    }
    
    if (age < 0 || age > 150) {
        printf("年龄不合理!\n");
        return 1;
    }
    
    printf("年龄:%d\n", age);
    
    return 0;
}

练习题

练习1:温度转换器

编写程序,输入摄氏度,输出华氏度。 公式:F = C × 9/5 + 32

练习2:圆面积计算

输入半径,计算并输出圆的面积和周长。

练习3:时间转换

输入秒数,转换为"X小时Y分钟Z秒"格式。

答案参考

查看答案

练习1:

#include <stdio.h>

int main() {
    float celsius, fahrenheit;
    
    printf("请输入摄氏度:");
    scanf("%f", &celsius);
    
    fahrenheit = celsius * 9.0 / 5.0 + 32.0;
    
    printf("%.2f°C = %.2f°F\n", celsius, fahrenheit);
    
    return 0;
}

练习2:

#include <stdio.h>

#define PI 3.1415926

int main() {
    float radius, area, perimeter;
    
    printf("请输入半径:");
    scanf("%f", &radius);
    
    area = PI * radius * radius;
    perimeter = 2 * PI * radius;
    
    printf("半径:%.2f\n", radius);
    printf("面积:%.2f\n", area);
    printf("周长:%.2f\n", perimeter);
    
    return 0;
}

练习3:

#include <stdio.h>

int main() {
    int total, hours, minutes, seconds;
    
    printf("请输入秒数:");
    scanf("%d", &total);
    
    hours = total / 3600;
    minutes = (total % 3600) / 60;
    seconds = total % 60;
    
    printf("%d秒 = %d小时%d分钟%d秒\n", 
           total, hours, minutes, seconds);
    
    return 0;
}

知识点总结

  • ✅ printf - 格式化输出
  • ✅ scanf - 格式化输入(注意&符号)
  • ✅ getchar/putchar - 字符输入输出
  • ✅ fgets - 安全的字符串输入
  • ✅ 格式控制:宽度、精度、对齐

下一步

👉 条件判断 if-else

最近更新: 2025/12/26 14:29
Prev
运算符详解
Next
条件判断 if-else