C语言学习笔记 - 35.数据类型 - printf函数的非输出控制符与格式优化

本知识点对应谭浩强《C程序设计(第五版)》第3章3.4.3节"用printf函数输出数据",是printf函数用法的重要补充,重点解决程序输出的可读性问题。


一、非输出控制符的核心概念

1.1 定义与区分

printf函数的格式字符串由两部分组成:

  • 输出控制符 :以百分号%开头的字符,用于指定变量的输出格式,如%d%x%c等。

  • 非输出控制符 :格式字符串中除输出控制符以外的所有字符,会原样输出到显示器

示例

复制代码
printf("i=%d, j=%d\n", i, j);
  • 输出控制符:%d%d

  • 非输出控制符:i=,j=\n

1.2 常见非输出控制符

  • 普通字符:空格、逗号、冒号、汉字说明文字等。

  • 转义字符:\n(换行)、\t(制表符)等。

注意\n是典型的非输出控制符,它不是以%开头,作用是将输出光标移动到下一行开头。


二、输出格式的可读性优化

2.1 无格式输出的问题

如果只使用输出控制符而不添加任何非输出控制符,多个变量的输出结果会连在一起,难以区分。

错误示例

复制代码
#include <stdio.h>

int main() {
    int j = 3;
    int k = 5;
    
    printf("%d%d\n", j, k); // 无任何非输出控制符
    return 0;
}

输出结果

复制代码
35

问题:无法区分输出的是"3和5"还是"35",可读性极差。

2.2 优化方法

通过添加非输出控制符,可以清晰分隔不同变量的输出,添加说明文字,让输出结果一目了然。

优化示例1:添加分隔符

复制代码
#include <stdio.h>

int main() {
    int j = 3;
    int k = 5;
    
    printf("%d %d\n", j, k);   // 添加空格分隔,输出:3 5
    printf("%d,%d\n", j, k);   // 添加逗号分隔,输出:3,5
    return 0;
}

优化示例2:添加变量说明

复制代码
#include <stdio.h>

int main() {
    int j = 3;
    int k = 5;
    
    printf("j=%d, k=%d\n", j, k); // 添加变量名说明
    return 0;
}

输出结果

复制代码
j=3, k=5

优势:任何人看到输出结果都能立刻明白每个数值对应的变量含义。

2.3 格式优化的重要性

程序不仅要功能正确,还要具有良好的可读性。就像软件产品需要友好的用户界面一样,程序的输出结果也应该清晰易懂。即使程序逻辑再完美、运行速度再快,如果输出结果混乱不堪,别人也无法使用和理解。


三、printf基本用法总结

printf函数的四种基本用法已经全部讲解完毕:

  1. 直接输出字符串printf("Hello World!\n");

  2. 带单个输出控制符printf("%d\n", i);

  3. 带多个输出控制符printf("%d %d\n", j, k);

  4. 混合输出控制符与非输出控制符printf("j=%d, k=%d\n", j, k);

注意 :其他输出控制符(如%s字符串输出)将在后续章节中讲解。%o(八进制输出)在现代编程中使用极少,了解即可。


四、要点总结

  1. printf格式字符串由输出控制符非输出控制符两部分组成。

  2. 输出控制符以%开头,用于指定变量的输出格式。

  3. 非输出控制符会原样输出,用于分隔数据、添加说明文字、控制输出位置。

  4. 必须重视输出格式的可读性,通过添加非输出控制符让输出结果清晰易懂。

  5. 程序不仅要功能正确,还要具有良好的用户体验,输出格式是用户体验的重要组成部分。

相关推荐
_李小白13 分钟前
【android opencv学习笔记】Day 31:提取轮廓之Canny算法
android·opencv·学习
智者知已应修善业20 分钟前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J21 分钟前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
零陵上将军_xdr21 分钟前
后端转全栈学习-Day6-JavaScript 基础-4
前端·javascript·学习
爱装代码的小瓶子22 分钟前
3. 设计buffer模块
linux·服务器·开发语言·c++·php
郝学胜-神的一滴22 分钟前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
开发语言·c++·qt·程序人生·软件构建·用户界面
keykey6.23 分钟前
迁移学习实战:用预训练模型做图像分类
开发语言·人工智能·深度学习·机器学习
双河子思24 分钟前
《代码整洁之道》——读书笔记(持续更新)
开发语言·c++·c#
川冰ICE24 分钟前
JavaScript实战②|电商网站交互效果,轮播图与购物车
开发语言·javascript·交互
数智工坊25 分钟前
周志华《Machine Learning》学习笔记--第十四章--概率图模型
笔记·学习·机器学习