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

C语言基础入门:2.5基础输入输出

【C语言基础】输入输出完全指南:从printf到缓冲区安全

文章目录

  • 【C语言基础】输入输出完全指南:从printf到缓冲区安全
    • 一、格式化输出艺术:printf函数详解
    • 二、scanf输入安全与缓冲区处理
    • 三、字符级交互:getchar与putchar实战
    • 程序员建议(新手必看)
    • 理解检测(答案下期公布)

一、格式化输出艺术:printf函数详解

#include <stdio.h>

int main(void) {
    // 基础整数输出
    int age = 25;
    printf("我的年龄是:%d\n", age);  // 【%d】处理整型数据
  
    // 浮点数精度控制
    double pi = 3.1415926;
    printf("圆周率:%.2f\n", pi);     // 【%.2f】保留两位小数
  
    // 字符串格式化
    char name[] = "Alice";
    printf("姓名:%s | 长度:%zu\n", name, sizeof(name));  // 【%s】字符串,%zu输出size_t类型
  
    // 组合式输出
    printf("%-10s|%5d|%8.3f\n", "Tom", 30, 98.7654);  // -号左对齐,数字控制列宽
    return 0;
}

【关键知识点】:

  • 格式说明符必须与变量类型严格匹配
  • 使用%m.nf控制浮点数显示精度
  • %-10s实现左对齐字符串输出

二、scanf输入安全与缓冲区处理

#include <stdio.h>

int main(void) {
    // 危险示例:可能引发缓冲区溢出
    char danger_str[10];
    // printf("输入字符串(危险):");
    // scanf("%s", danger_str);  // 输入超过9字符会导致溢出
  
    // 安全解决方案
    char safe_str[10];
    printf("输入字符串(安全):");
    scanf("%9s", safe_str);  // 【字段宽度限制】确保不超过数组容量
  
    // 混合输入处理
    int num;
    char ch;
    printf("输入数字和字符:");
    scanf("%d %c", &num, &ch);  // 空格跳过空白字符
  
    // 清空输入缓冲区
    while(getchar() != '\n');  // 【重要】清除残留输入
  
    return 0;
}

【输入安全要点】:

  • 始终为字符串指定最大长度(如%9s
  • 检查scanf返回值验证输入有效性
  • 处理混合输入时及时清空缓冲区

三、字符级交互:getchar与putchar实战

#include <stdio.h>

int main(void) {
    // 字符回显程序
    printf("输入字符(按q退出):\n");
    char c;
    while((c = getchar()) != 'q') {  // 【注意】getchar()返回int类型
        putchar(c);
        if(c == '\n') continue;      // 跳过换行符处理
    }

    // 输入确认功能实现
    printf("确定要退出吗?(y/n)");
    int confirm = getchar();
    while(getchar() != '\n');        // 清空输入缓冲区
    if(confirm == 'y') {
        printf("程序退出\n");
    }
  
    return 0;
}

【字符处理技巧】:

  • 使用int类型接收getchar返回值(正确处理EOF)
  • 组合使用getcharwhile循环处理连续输入
  • 利用字符函数实现简单交互逻辑

程序员建议(新手必看)

  1. 输入输出格式统一原则:printf的格式字符串应与实际数据类型完全匹配
  2. 防御性编程:使用fgets+sscanf组合替代直接使用scanf
  3. 缓冲区管理三步法:
    • 设置合理的输入长度限制
    • 检查函数返回值
    • 及时清空输入缓冲区
  4. 交互优化技巧:在关键操作前添加fflush(stdin)强制刷新输入流

理解检测(答案下期公布)

  1. 编写程序输出如下表格:
姓名     年龄    成绩
Alice     20     95.50
Bob       22     89.00
  1. 实现安全密码输入功能:

    • 显示星号替代实际输入
    • 限制最大长度16字符
    • 支持退格键修改
  2. 编写程序验证用户输入的整数是否符合范围要求(1-100),若不符合要求重新输入


下期预告:《C语言流程控制:从条件语句到循环优化》,欢迎在评论区留下您对本文的疑问或建议!


http://www.kler.cn/a/543118.html

相关文章:

  • 实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)
  • 多机器人系统的大语言模型:综述
  • PySpark查找Dataframe中的非ASCII字符并导出Excel文件
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • 计算机毕业设计——Springboot的旅游管理
  • 接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成
  • Ubuntu 上安装和配置 Apache RocketMQ 4.7.1
  • Linux | 系统调用
  • 变化检测相关论文可读list
  • 展厅为何倾向使用三维数字沙盘进行多媒体互动设计?优势探讨!
  • 8K样本在DeepSeek-R1-7B模型上的复现效果
  • [隧道代理] 隧道代理 — 端口转发 - SSH 端口转发
  • deepseek + kimi 高效生成PPT
  • 如何在个人电脑本地化部署Deepseek-R1大模型
  • 【Rust中级教程】1.4. 内存 Pt.2:栈内存、栈帧(stack frame)、栈指针(stack pointer)
  • 【动态规划篇】:动态规划解决路径难题--思路,技巧与实例
  • 国产化FMC接口通用计算平台设计原理图:2367-基于FMQL45T900 FMC接口通用计算平台
  • .NET Web-静态文件访问目录浏览
  • Django中apps.py作用
  • Day58_20250206_图论part3_101.孤岛的总面积|102.沉没孤岛|103.水流问题|104.建造最大岛屿
  • 51c大模型~合集112
  • 集合家族详情
  • ASUS/华硕飞行堡垒9 FX506H FX706H 原厂Win10系统 工厂文件 带ASUS Recovery恢复
  • 基于 ollama 在linux 私有化部署DeepSeek-R1以及使用RESTful API的方式使用模型
  • vue2 多页面pdf预览
  • 2025年02月12日Github流行趋势