C&C++快速入门

15、输入输出函数

1、课程目标

  • 掌握printf/scanf系列函数
  • 理解标准输入输出与文件IO
  • 掌握Windows控制台API
  • 了解缓冲区和流的概念

2、名词解释

术语 说明
printf 格式化输出到标准输出
scanf 从标准输入格式化读取
fprintf/fscanf 文件格式化IO
stdout/stdin/stderr 标准输出/输入/错误流
缓冲区 临时存储区,提高IO效率
fflush 刷新缓冲区

3、代码实现

1. printf格式化输出

#include <stdio.h>

int main() {
    printf("=== printf格式化 ===\n\n");
    
    // 基本格式
    printf("【基本格式】\n");
    printf("整数: %d\n", 42);
    printf("无符号: %u\n", 42u);
    printf("十六进制: 0x%X\n", 255);
    printf("浮点数: %f\n", 3.14159);
    printf("字符串: %s\n", "Hello");
    printf("字符: %c\n", 'A');
    printf("指针: %p\n", (void*)main);
    
    // 宽度和精度
    printf("\n【宽度和精度】\n");
    printf("[%10d]\n", 42);       // 右对齐,宽度10
    printf("[%-10d]\n", 42);      // 左对齐
    printf("[%010d]\n", 42);      // 补零
    printf("[%.5f]\n", 3.14);     // 精度5位
    printf("[%.5s]\n", "Hello World"); // 截断字符串
    
    return 0;
}

2. scanf输入

#include <stdio.h>

int main() {
    printf("=== scanf输入 ===\n\n");
    
    int num;
    char str[50];
    
    // 基本输入
    printf("输入一个整数: ");
    if (scanf("%d", &num) == 1) {
        printf("你输入了: %d\n", num);
    }
    
    // 清除输入缓冲区
    while (getchar() != '\n');
    
    // 字符串输入
    printf("输入一个单词: ");
    scanf("%49s", str);  // 限制长度防止溢出
    printf("你输入了: %s\n", str);
    
    // 更安全的输入方式: fgets
    while (getchar() != '\n');
    printf("输入一行文字: ");
    if (fgets(str, sizeof(str), stdin)) {
        printf("你输入了: %s", str);
    }
    
    return 0;
}

3. Windows控制台API

#include <stdio.h>
#include <windows.h>

int main() {
    // 获取控制台句柄
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
    
    // 设置文本颜色
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    printf("红色文字\n");
    
    SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    printf("绿色文字\n");
    
    // 恢复默认颜色
    SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    printf("正常颜色\n");
    
    // 使用WriteConsole
    const char* msg = "\nHello WriteConsole!\n";
    DWORD written;
    WriteConsoleA(hOut, msg, strlen(msg), &written, NULL);
    
    return 0;
}

4、课后作业

4.1、作业1:输入验证

实现一个安全的整数输入函数,能处理无效输入。

4.2、作业2:彩色输出

封装一个支持彩色输出的printf函数。