printf函数

  • printf函数称之为格式输出函数,方法名称的最后一个字母f表示format。其功能是按照用户指定的格式,把指定的数据输出到屏幕上
  • printf函数的调用格式为:
    • printf("格式控制字符串",输出项列表 );
    • 例如:printf("a = %d, b = %d",a, b);
    • 非格式字符串原样输出, 格式控制字符串会被输出项列表中的数据替换
    • 注意: 格式控制字符串和输出项在数量和类型上***必须一一对应***

  • 格式控制字符串

    • 形式: %[标志][输出宽度][.精度][长度]类型

  • 类型

    • 格式: printf("a = %类型", a);
    • 类型字符串用以表示输出数据的类型, 其格式符和意义如下所示
类型 含义
d 有符号10进制整型
i 有符号10进制整型
u 无符号10进制整型
o 无符号8进制整型
x 无符号16进制整型
X 无符号16进制整型
f 单、双精度浮点数(默认保留6位小数)
e / E 以指数形式输出单、双精度浮点数
g / G 以最短输出宽度,输出单、双精度浮点数
c 字符
s 字符串
p 地址
#include <stdio.h>
int main(){int a = 10;int b = -10;float c = 6.6f;double d = 3.1415926;double e = 10.10;char f = 'a';// 有符号整数(可以输出负数)printf("a = %d\n", a); // 10printf("a = %i\n", a); // 10// 无符号整数(不可以输出负数)printf("a = %u\n", a); // 10printf("b = %u\n", b); // 429496786// 无符号八进制整数(不可以输出负数)printf("a = %o\n", a); // 12printf("b = %o\n", b); // 37777777766// 无符号十六进制整数(不可以输出负数)printf("a = %x\n", a); // aprintf("b = %x\n", b); // fffffff6// 无符号十六进制整数(不可以输出负数)printf("a = %X\n", a); // Aprintf("b = %X\n", b); // FFFFFFF6// 单、双精度浮点数(默认保留6位小数)printf("c = %f\n", c); // 6.600000printf("d = %lf\n", d); // 3.141593// 以指数形式输出单、双精度浮点数printf("e = %e\n", e); // 1.010000e+001printf("e = %E\n", e); // 1.010000E+001// 以最短输出宽度,输出单、双精度浮点数printf("e = %g\n", e); // 10.1printf("e = %G\n", e); // 10.1// 输出字符printf("f = %c\n", f); // a
}

  • 宽度

    • 格式: printf("a = %[宽度]类型", a);
    • 用十进制整数来指定输出的宽度, 如果实际位数多于指定宽度,则按照实际位数输出, 如果实际位数少于指定宽度则以空格补位
#include <stdio.h>
int main(){// 实际位数小于指定宽度int a = 1;printf("a =|%d|\n", a); // |1|printf("a =|%5d|\n", a); // |    1|// 实际位数大于指定宽度int b = 1234567;printf("b =|%d|\n", b); // |1234567|printf("b =|%5d|\n", b); // |1234567|
}

  • 标志

    • 格式: printf("a = %[标志][宽度]类型", a);
标志 含义
- 左对齐, 默认右对齐
+ 当输出值为正数时,在输出值前面加上一个+号, 默认不显示
0 右对齐时, 用0填充宽度.(默认用空格填充)
空格 输出值为正数时,在输出值前面加上空格, 为负数时加上负号
# 对c、s、d、u类型无影响
# 对o类型, 在输出时加前缀o
# 对x类型,在输出时加前缀0x
#include <stdio.h>
int main(){int a = 1;int b = -1;// -号标志printf("a =|%d|\n", a); // |1|printf("a =|%5d|\n", a); // |    1|printf("a =|%-5d|\n", a);// |1    |// +号标志printf("a =|%d|\n", a); // |1|printf("a =|%+d|\n", a);// |+1|printf("b =|%d|\n", b); // |-1|printf("b =|%+d|\n", b);// |-1|// 0标志printf("a =|%5d|\n", a); // |    1|printf("a =|%05d|\n", a); // |00001|// 空格标志printf("a =|% d|\n", a); // | 1|printf("b =|% d|\n", b); // |-1|// #号int c = 10;printf("c = %o\n", c); // 12printf("c = %#o\n", c); // 012printf("c = %x\n", c); // aprintf("c = %#x\n", c); // 0xa
}

  • 精度

    • 格式: printf("a = %[精度]类型", a);
    • 精度格式符以"."开头, 后面跟上十进制整数, 用于指定需要输出多少位小数, 如果输出位数大于指定的精度, 则删除超出的部分
#include <stdio.h>
int main(){double a = 3.1415926;printf("a = %.2f\n", a); // 3.14
}
  • 动态指定保留小数位数

    • 格式: printf("a = %.*f", a);
#include <stdio.h>
int main(){double a = 3.1415926;printf("a = %.*f", 2, a); // 3.14
}
  • 实型(浮点类型)有效位数问题

    • 对于单精度数,使用%f格式符输出时,仅前6~7位是有效数字
    • 对于双精度数,使用%lf格式符输出时,前15~16位是有效数字
    • 有效位数和精度(保留多少位)不同, 有效位数是指从第一个非零数字开始,误差不超过本数位半个单位的、精确可信的数位
    • 有效位数包含小数点前的非零数位
#include <stdio.h>
int main(){//        1234.567871093750000float a = 1234.567890123456789;//         1234.567890123456900double b = 1234.567890123456789;printf("a = %.15f\n", a); // 前8位数字是准确的, 后面的都不准确printf("b = %.15f\n", b); // 前16位数字是准确的, 后面的都不准确
}

  • 长度

    • 格式: printf("a = %[长度]类型", a);
长度 修饰类型 含义
hh d、i、o、u、x 输出char
h d、i、o、u、x 输出 short int
l d、i、o、u、x 输出 long int
ll d、i、o、u、x 输出 long long int
#include <stdio.h>
int main(){char a = 'a';short int b = 123;int  c = 123;long int d = 123;long long int e = 123;printf("a = %hhd\n", a); // 97printf("b = %hd\n", b); // 123printf("c = %d\n", c); // 123printf("d = %ld\n", d); // 123printf("e = %lld\n", e); // 123
}
  • 转义字符

    • 格式: printf("%f%%", 3.1415);
    • %号在格式控制字符串中有特殊含义, 所以想输出%必须添加一个转移字符
#include <stdio.h>
int main(){printf("%f%%", 3.1415); // 输出结果3.1415%
}

##Scanf函数

  • scanf函数用于接收键盘输入的内容, 是一个阻塞式函数,程序会停在scanf函数出现的地方, 直到接收到数据才会执行后面的代码
  • printf函数的调用格式为:
    • scanf("格式控制字符串", 地址列表);
    • 例如: scanf("%d", &num);

  • 基本用法

    • 地址列表项中只能传入变量地址, 变量地址可以通过&符号+变量名称的形式获取
#include <stdio.h>
int main(){int number;scanf("%d", &number); // 接收一个整数printf("number = %d\n", number);
}
  • 接收非字符和字符串类型时, 空格、Tab和回车会被忽略
#include <stdio.h>
int main(){float num;// 例如:输入 Tab 空格 回车 回车 Tab 空格 3.14 , 得到的结果还是3.14scanf("%f", &num);printf("num = %f\n", num);
}
  • 非格式字符串原样输入, 格式控制字符串会赋值给地址项列表项中的变量

    • 不推荐这种写法
#include <stdio.h>
int main(){int number;// 用户必须输入number = 数字  , 否则会得到一个意外的值scanf("number = %d", &number);printf("number = %d\n", number);
}
  • 接收多条数据

    • 格式控制字符串和地址列表项在数量和类型上必须一一对应
    • 非字符和字符串情况下如果没有指定多条数据的分隔符, 可以使用空格或者回车作为分隔符(不推荐这种写法)
    • 非字符和字符串情况下建议明确指定多条数据之间分隔符
#include <stdio.h>
int main(){int number;scanf("%d", &number);printf("number = %d\n", number);int value;scanf("%d", &value);printf("value = %d\n", value);
}
#include <stdio.h>
int main(){int number;int value;// 可以输入 数字 空格 数字, 或者 数字 回车 数字scanf("%d%d", &number, &value);printf("number = %d\n", number);printf("value = %d\n", value);
}
#include <stdio.h>
int main(){int number;int value;// 输入 数字,数字 即可scanf("%d,%d", &number, &value);printf("number = %d\n", number);printf("value = %d\n", value);
}
  • \n是scanf函数的结束符号, 所以格式化字符串中不能出现\n
#include <stdio.h>
int main(){int number;// 输入完毕之后按下回车无法结束输入scanf("%d\n", &number);printf("number = %d\n", number);
}

scanf运行原理

  • 系统会将用户输入的内容先放入输入缓冲区
  • scanf方式会从输入缓冲区中逐个取出内容赋值给变量
  • 如果输入缓冲区的内容不为空,scanf会一直从缓冲区中获取,而不要求再次输入
#include <stdio.h>
int main(){int num1;int num2;char ch1;scanf("%d%c%d", &num1, &ch1, &num2);printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);char ch2;int num3;scanf("%c%d",&ch2, &num3);printf("ch2 = %c, num3 = %d\n", ch2, num3);
}
  • 利用fflush方法清空缓冲区(不是所有平台都能使用)

    • 格式: fflush(stdin);
    • C和C++的标准里从来没有定义过 fflush(stdin)
    • MSDN 文档里清除的描述着"fflush on input stream is an extension to the C standard" (fflush 是在标准上扩充的函数, 不是标准函数, 所以不是所有平台都支持)
  • 利用setbuf方法清空缓冲区(所有平台有效)

    • 格式: setbuf(stdin, NULL);
#include <stdio.h>
int main(){int num1;int num2;char ch1;scanf("%d%c%d", &num1, &ch1, &num2);printf("num1 = %d, ch1 = %c, num2 = %d\n", num1, ch1, num2);//fflush(stdin); // 清空输入缓存区setbuf(stdin, NULL); // 清空输入缓存区char ch2;int num3;scanf("%c%d",&ch2, &num3);printf("ch2 = %c, num3 = %d\n", ch2, num3);
}

putchar和getchar

  • putchar: 向屏幕输出一个字符
#include <stdio.h>
int main(){char ch = 'a';putchar(ch); // 输出a
}
  • getchar: 从键盘获得一个字符
#include <stdio.h>
int main(){char ch;ch = getchar();// 获取一个字符printf("ch = %c\n", ch);
}

配套视频地址

江哥带你玩转C语言 | 05-printf 和 scanf 函数相关推荐

  1. 江哥带你玩转C语言 02- 创建第一个C语言程序

    Hello world 这个世界上, 几乎所有程序员入门的第一段代码都是Hello World. 原因是当年C语言的作者Dennis Ritchie(丹尼斯 里奇)在他的名著中第一次引入, 传为后世经 ...

  2. 江哥带你玩转C语言| 12 -二维数组和字符串

    二维数组 所谓二维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一维数组. 示例: int a[2][3] = { {80,75,92}, {61,65 ...

  3. 江哥带你玩转C语言 | 11- C语言排序算法

    计数排序(Counting Sort) 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法. ...

  4. 江哥带你玩转C语言 | 04-C语言常量和变量

    什么是数据? 生活中无时无刻都在跟数据打交道 例如:人的体重.身高.收入.性别等数据等 在我们使用计算机的过程中,也会接触到各种各样的数据 例如: 文档数据.图片数据.视频数据等 数据分类 静态的数据 ...

  5. 江哥带你玩转C语言 | 03-C语言关键字和标识符

    什么是注释? 注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解.解释的意思 注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流沟通 注释可以是任何文字,也就是说 ...

  6. 江哥带你玩转C语言 | 17-文件操作

    文件基本概念 文件流: C 语言把文件看作是一个字符的序列,即文件是由一个一个字符组成的字符流,因此 c 语言将文件也称之为文件流. 文件分类 文本文件 以 ASCII 码格式存放,一个字节存放一个字 ...

  7. 江哥带你玩转C语言 - 16-内存管理和链表

    内存管理 进程空间 程序,是经源码编译后的可执行文件,可执行文件可以多次被执行,比如我们可以多次打开 office. 而进程,是程序加载到内存后开始执行,至执行结束,这样一段时间概念,多次打开的wps ...

  8. 江哥带你玩转C语言 | 09 - C语言进制和位运算

    进制基本概念 什么是进制? 进制是一种计数的方式,数值的表示形式 常见的进制 十进制.二进制.八进制.十六进制 进制书写的格式和规律 十进制 0.1.2.3.4.5.6.7.8.9 逢十进一 二进制 ...

  9. 江哥带你玩转C语言 | 13- 一级指针和多级指针

    指针基本概念 什么是地址 生活中的地址: 内存地址: 地址与内存单元中的数据是两个完全不同的概念 地址如同房间编号, 根据这个编号我们可以找到对应的房间 内存单元如同房间, 房间是专门用于存储数据的 ...

  10. 江哥带你玩转C语言 | 10- C语言数组

    数组的基本概念 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 在C语言中,数组属于构造数据类型 数组的几个名词 数组:一组相同数据类型数据的有序的集合 数组元素: 构成数组的 ...

最新文章

  1. 基于RDKit探索DrugBank
  2. JSON.parse()和eval()的区别
  3. 【数字信号处理】基本序列 ( 正弦序列 | 数字角频率 ω | 模拟角频率 Ω | 数字频率 f | 模拟频率 f0 | 采样频率 Fs | 采样周期 T )
  4. Codeforces Gym 100676G Training Camp 状压dp
  5. ASP.NET网络编程中经常用到的27个函数集
  6. PC网页实现九宫格切图功能
  7. 解决安卓模拟器没有网络的问题,刚开的做RN的我遇见这个问题真很头疼,所以希望看到我这篇文章能够解决。
  8. Cortex-M3基础
  9. opencv 矫正图片
  10. Spring源码:ApplicationContextInitializer
  11. 相机成像原理_照相机、摄影机的成像原理
  12. ANE 在 Android 上的应用
  13. c语言实验报告4结构体,c语言实验报告结构体.doc
  14. GPIO模拟MDC/MDIO协议
  15. Tiny 6410 K9GAG08U0E nand flash移植uboot
  16. HttpClient Cookie rejected警告
  17. 人工神经网络的英文简称,人工神经网络英语全称
  18. 粘贴时怎样跳过隐藏行,excel技巧
  19. spss三次指数平滑_15.2.2 指数平滑模型的SPSS操作(1)
  20. 数据库插入、删除、修改语句

热门文章

  1. 我的创业你也可以复制:工商登记、刻章、税务登记和银行开户
  2. 安装win7缺少所需的CD/DVD驱动器设备驱动程序
  3. 微信小程序 php读取数据,在微信小程序中如何获取输入数据
  4. 【迅为资料上新】iTOP-3568开发板指南手册
  5. 直播提醒|详解动作迁移理论及实践,1小时复刻故人笑!
  6. 计算机网络安全及防火墙技术任务书,毕业设计(论文)-计算机网络安全技术分析.doc...
  7. 提取DVD光盘(或镜像)音乐曲目方法
  8. android 连接打印机sdk,GitHub - 13671447200/Printer-Android-SDK
  9. Java中的poi是什么_java poi介绍
  10. IIC实验(测温度湿度)