当前位置: 首页 > news >正文

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);  // 空格跳过空白字符
http://www.lqws.cn/news/545401.html

相关文章:

  • 问卷调查[bell ring]
  • 全志A733、瑞芯微RK3576与联发科MTK8371场景化应用解析在物联网与智能设备快速迭代的今天,芯片作为硬件核心直接决定了设备的性能边界与应用场景。
  • moduo之tcp客户端TcpClient
  • Webpack 自定义插件开发指南:构建流程详解与实战开发全攻略
  • Html5播放器禁止拖动播放器进度条(教学场景)
  • 神经网络的概念和案例
  • FrozenBatchNorm2d 详解
  • 聚铭网络入选嘶吼《中国网络安全细分领域产品名录》“云平台安全管理”与“态势感知”双领域TOP10
  • Linux tcp_info:监控TCP连接的秘密武器
  • CatBoost:征服类别型特征的梯度提升王者
  • 蓝牙工作频段与跳频扩频技术(FHSS)详解:面试高频考点与真题解析
  • System.Threading.Tasks 库简介
  • ubuntu ollama 遇到的若干问题
  • Linux命令行操作基础
  • WPF 3D 开发全攻略:实现3D模型创建、旋转、平移、缩放
  • 记录一个C#/.NET的HTTP工具类
  • Feign 实战指南:从 REST 替代到性能优化与最佳实践
  • 文法、正规式相关习题
  • Linux系统(信号篇)信号的保存
  • WinAppDriver 自动化测试:JavaScript 篇
  • gRPC技术解析与python示例
  • Python基础知识之文件
  • JMH (Java Microbenchmark Harness)
  • .NET MAUI跨平台串口通讯方案
  • (LeetCode 面试经典 150 题 ) 238. 除自身以外数组的乘积 (前缀和)
  • LeetCode 312 戳气球题解(Swift)+ 区间 DP 原理详解 + 可运行代码
  • WSL升级到24.04
  • 使用 asp.net core webapi 导出数据文件
  • .NetCore+Vue快速生产框架开发详细方案
  • LeetCode 349题解 | 两个数组的交集