格式化输出和输入

标准I/O -- 格式化输出

格式化输出函数是 C 语言中最常用的输出方式,它们允许我们按照指定的格式将数据输出到不同的目标。

常用格式化输出函数

c 复制代码
#include <stdio.h>

int printf(const char *fmt, ...);                    // 输出到标准输出(stdout)
int fprintf(FILE *stream, const char *fmt, ...);     // 输出到指定文件流
int sprintf(char *s, const char *fmt, ...);          // 输出到字符串缓冲区

函数参数说明

  • fmt: 格式控制字符串,包含普通字符和格式说明符
  • ...: 可变参数列表,对应格式说明符要输出的数据
  • stream : 文件指针,指定输出目标(如 stdoutstderr 或文件)
  • s: 字符数组(字符串缓冲区),用于接收格式化后的字符串

返回值说明

  • 成功时 : 返回输出的字符个数(不包括字符串结尾的 \0
  • 出错时 : 返回 EOF(通常为 -1)

常用格式说明符

格式符 说明 示例
%d 十进制整数 printf("%d", 42);
%f 浮点数 printf("%.2f", 3.14159);
%c 单个字符 printf("%c", 'A');
%s 字符串 printf("%s", "Hello");
%p 指针地址 printf("%p", &var);
%x 十六进制整数 printf("%x", 255);

使用示例

c 复制代码
#include <stdio.h>

int main() {
    int age = 25;
    float score = 89.5;
    char name[] = "张三";
    
    // 基本输出
    printf("姓名: %s, 年龄: %d, 分数: %.1f\n", name, age, score);
    
    // 输出到标准错误
    fprintf(stderr, "错误信息: 文件打开失败\n");
    
    // 格式化到字符串
    char buffer[100];
    sprintf(buffer, "用户: %s, 得分: %.2f", name, score);
    printf("格式化结果: %s\n", buffer);
    
    
    return 0;
}

常用格式化输入函数

c 复制代码
#include <stdio.h>

int scanf(const char *format, ...);                    // 从标准输入(stdin)读取
int fscanf(FILE *stream, const char *format, ...);     // 从指定文件流读取
int sscanf(const char *str, const char *format, ...);  // 从字符串读取

函数参数说明

  • format: 格式控制字符串,指定期望的输入格式
  • ...: 可变参数列表,必须是变量的地址(指针)
  • stream: 文件指针,指定输入源
  • str: 源字符串,从中解析数据

返回值说明

  • 成功时: 返回成功匹配并赋值的输入项数量
  • 出错时 : 返回 EOF(通常为 -1),或在文件结束时返回 EOF
  • 部分匹配: 返回成功匹配的项数(可能小于预期)

常用格式说明符

格式符 说明 示例输入 变量类型
%d 十进制整数 42 int*
%f 浮点数 3.14 float*
%lf 双精度浮点数 3.14159 double*
%c 单个字符 A char*
%s 字符串(不含空白) Hello char[]
%[^] 扫描字符集 abc123 char[]
%% 匹配百分号 %

使用示例

c 复制代码
#include <stdio.h>

int main() {
    int age;
    float height;
    char name[50];
    
    // 从标准输入读取
    printf("请输入姓名、年龄和身高(用空格分隔): ");
    int items = scanf("%s %d %f", name, &age, &height);
    
    if (items == 3) {
        printf("读取成功: %s, %d岁, %.2f米\n", name, age, height);
    } else {
        printf("输入格式错误,只读取了 %d 项\n", items);
    }
    
    // 从字符串读取
    char data[] = "John 25 175.5";
    char person_name[20];
    int person_age;
    float person_height;
    
    sscanf(data, "%s %d %f", person_name, &person_age, &person_height);
    printf("从字符串解析: %s, %d岁, %.1fcm\n", person_name, person_age, person_height);
    
    // 从文件读取
    FILE *file = fopen("data.txt", "r");
    if (file) {
        int file_value;
        while (fscanf(file, "%d", &file_value) != EOF) {
            printf("从文件读取: %d\n", file_value);
        }
        fclose(file);
    }
    
    return 0;
}

高级格式控制

1. 宽度限制

c 复制代码
char buffer[10];
scanf("%9s", buffer);  // 最多读取9个字符,留1位给\0

2. 跳过特定字符

c 复制代码
int day, month, year;
scanf("%d/%d/%d", &day, &month, &year);  // 输入: 26/06/2026

3. 字符集匹配

c 复制代码
char letters[100];
scanf("%[a-zA-Z]", letters);  // 只读取字母

4. 排除字符集

c 复制代码
char no_digits[100];
scanf("%[^0-9]", no_digits);  // 读取直到遇到数字