printf和scanf

一、printf函数 - 格式化输出

1. 基本语法
#include <stdio.h>

int printf(const char *format, ...);
  • 功能:按照指定格式向标准输出(通常是屏幕)打印数据
  • 返回值:成功返回输出的字符数,失败返回负数
2. 格式控制字符串

格式控制字符串由普通字符和格式说明符组成:

printf("普通字符 %格式说明符", 变量);

常见的格式说明符:

格式符描述示例
%d十进制整数printf("%d", 10);
%u无符号十进制整数printf("%u", 10);
%f浮点数printf("%f", 3.14);
%s字符串printf("%s", "Hi");
%c字符printf("%c", 'A');
%x十六进制整数(小写)printf("%x", 255);
%X十六进制整数(大写)printf("%X", 255);
%p指针地址printf("%p", &num);
%%打印百分号本身printf("%%");
3. 格式化选项

可以在%和格式符之间添加额外选项:

%[标志][宽度][.精度][长度]类型
  • 标志

    • -:左对齐(默认右对齐)
    • +:强制显示正负号
    • 0:数字前补零
    • 空格:正数前加空格
  • 宽度和精度

    printf("%5d", 123);    // 宽度为5,右对齐:"  123"
    printf("%-5d", 123);   // 左对齐:"123  "
    printf("%.2f", 3.1415); // 保留2位小数:"3.14"
    printf("%8.2f", 3.1415); // 总宽度8,小数2位:"    3.14"
    
  • long num = 1234567890L;
    printf("%ld", num);    // 使用%ld输出long类型
    
4. 示例代码
#include <stdio.h>

int main() {
    int num = 100;
    float f = 3.14159;
    char str[] = "Hello";
    
    // 基本输出
    printf("整数: %d\n", num);
    printf("浮点数: %f\n", f);
    printf("字符串: %s\n", str);
    
    // 格式化输出
    printf("宽度控制: |%10d|\n", num);           // 宽度10,右对齐
    printf("左对齐: |%-10d|\n", num);            // 左对齐
    printf("补零: |%010d|\n", num);              // 补零
    printf("浮点数精度: %.2f\n", f);             // 保留2位小数
    printf("组合控制: |%+010.2f|\n", -f);        // 带符号、补零、宽度10、2位小数
    
    return 0;
}

二、scanf函数 - 格式化输入

1. 基本语法
#include <stdio.h>

int scanf(const char *format, ...);
  • 功能:从标准输入(通常是键盘)读取数据并按格式存储到变量中
  • 返回值:成功匹配并赋值的变量个数,失败返回 EOF(通常为 - 1)
2. 格式控制字符串

printf类似,但用于解析输入:

scanf("%格式说明符", &变量地址);

常见的格式说明符:

格式符描述示例
%d读取十进制整数scanf("%d", &num);
%f读取浮点数scanf("%f", &f);
%s读取字符串(遇空格停止)scanf("%s", str);
%c读取单个字符scanf("%c", &ch);
%[ ]读取指定字符集scanf("%[0-9]", str);
3. 使用注意事项
  1. 变量地址:必须使用&取地址符(字符串数组除外)

    int num;
    scanf("%d", &num);  // 正确:传递变量地址
    
    char str[20];
    scanf("%s", str);   // 正确:数组名本身就是地址
    
  2. 空白字符处理

    • scanf默认会跳过空白字符(空格、制表符、换行符)
    • 读取字符时需特别注意:
      char ch1, ch2;
      scanf("%c", &ch1);  // 读取第一个字符
      scanf(" %c", &ch2); // 加空格跳过前面的空白字符
      
  3. 字符串读取限制

    • 使用%s读取字符串时存在缓冲区溢出风险
    • 建议指定最大宽度:
      char str[10];
      scanf("%9s", str);  // 最多读取9个字符,留一个位置给'\0'
      
4. 示例代码
#include <stdio.h>

int main() {
    int num;
    float f;
    char ch;
    char str[20];
    
    // 读取整数
    printf("请输入一个整数: ");
    scanf("%d", &num);
    printf("你输入的整数是: %d\n", num);
    
    // 读取浮点数
    printf("请输入一个浮点数: ");
    scanf("%f", &f);
    printf("你输入的浮点数是: %f\n", f);
    
    // 读取字符(注意空白字符)
    printf("请输入一个字符: ");
    scanf(" %c", &ch);  // 前面的空格跳过空白字符
    printf("你输入的字符是: %c\n", ch);
    
    // 读取字符串
    printf("请输入一个单词: ");
    scanf("%19s", str);  // 限制最大长度防止溢出
    printf("你输入的单词是: %s\n", str);
    
    return 0;
}

三、printfscanf的高级用法

1. 多变量输入输出
int a, b;
printf("请输入两个整数: ");
scanf("%d %d", &a, &b);  // 用空格分隔输入
printf("两数之和: %d\n", a + b);
2. 自定义输入格式
int year, month, day;
printf("请输入日期(YYYY-MM-DD): ");
scanf("%d-%d-%d", &year, &month, &day);
printf("你输入的日期是: %d年%d月%d日\n", year, month, day);
3. 错误处理

检查scanf的返回值:

int num;
printf("请输入一个整数: ");
if (scanf("%d", &num) != 1) {
    printf("输入错误!请输入一个整数。\n");
    // 清除输入缓冲区
    while (getchar() != '\n');
}

四、常见问题与技巧

1. 输入缓冲区问题
  • scanf读取输入后,缓冲区可能残留换行符
  • 解决方法:
    // 清除输入缓冲区
    while (getchar() != '\n');
    
2. 读取带空格的字符串

使用%[^\n]读取整行:

char str[100];
printf("请输入一行文字: ");
scanf(" %[^\n]", str);  // 跳过空白,读取直到换行符
printf("你输入的是: %s\n", str);

3. 读取单个字符

确保跳过前面的空白字符:

char ch;
scanf(" %c", &ch);  // 空格跳过空白字符
posted @ 2025-06-27 12:27  RaLi  阅读(0)  评论(0)    收藏  举报  来源