C语言_格式化输入输出

Ustinain 等级 400 1 1

C语言_格式化输入输出

我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d 说明要整数的类型,%f说明要以浮点数输出

  • printf()

  • %[flags][width][.prec][hlL]type

  • scanf()

  • %[flag]type

    我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d 说明要整数的类型,%f说明要以浮点数输出,殊不知这其中还有很多数值....

  • %[flags][width][.prec][hlL]type

type 含义
- 左对齐
+ 在前面放+或-
(space) 正数留空
0 0填充
我们来试一下这样的事情,如下 做一个简单的模型
    printf("%9d\n",123);
    printf("%-9d\n",123);

第一个%9d表示后面数字的输出占据九个字符的空间,并且是右对齐的,所以前面留出来空格 而第二个带-号表示是左对齐

"+" 号含义是后面要跟上+号或者- 号,我们试试

  printf("%+9d\n",123);
  printf("%+-9d\n",123);

运行结果: C语言_格式化输入输出 果不其然 ,前面加上了+号

printf("%+9d\n",-123);
printf("%+-9d\n",-123);

运行结果: C语言_格式化输入输出 这样都没什么问题 其实如果不要第二行这个+ 号,编译器也同样会加上-号的,那么我们加0呢

printf("%09d\n",123);
printf("%0-9d\n",-123);

运行结果: C语言_格式化输入输出 可以看到右对齐的前面补了零,而左对齐的-123是不能补零的,总不能向后填零吧 |width或prec | 含义 | |--|--| | number |最小字符数| ||下一个参数是字符数| |.number|小数点后的位数| |.|下一个参数是小数点后的位数

printf("%9.2f\n",123.0);

运行结果: C语言_格式化输入输出 这里注意一下, 小数点前面的9指的是整个数字包括小数点以及小数点后面的0,总和占9个字符 而不是小数点前面占9个字符,.2f 表示精确到小数点后俩位 那么那个*又是表达什么意思呢

printf("%*d\n",5,123);
printf("%9.2f\n",123.0);

运行结果: C语言_格式化输入输出 可以看到第一行后面的形参多了一个,就好比把5 这个值替换了*,而后面的123是用来满足这个%d的,原本要填入%后面的数字,现在可以替换出来,而一旦变成后面的参数,那他就可以是一个变量了,而不是常量,给我们的代码格式带来了很大的灵活性

类型修饰 含义
hh 单个字节
h short
l long
ll long long
L long double
type 作用
i或d int
u unsigned int
a或A 十进制浮点数
0 八进制
c char
x 十六进制
s 字符串
X 字母大写的十六进制
p 指针
f或F float
n 读写/写入的个数
e或E 指数
暂时列出来,有些学到后面会慢慢遇见 ,不过这里要讲一下n这个type
int num;
printf("%dsos%n\n",12345,&num);

运行结果: C语言_格式化输入输出 字符串后面的第一个参数12345,满足了%d,后面的sos也输出了, %n说明符输出有效字符数量,然后把个数传入后面的指针里。

  • scanf
  • %[flag]tpye
flag 含义
* 跳过
数字 最大字符数
hh char
h short
l long ldouble
ll long long
L long double

有一点我们需要注意,我们要确保转换说明的数量、类型、和后面的参数的数量、类型一样,例如下面的语句中有俩个%d转换说明,说明后面还有俩个参数

printf("%d 个苹果 %d 元\n",number,money);

后面的确有俩个参数 用来满足俩个%d转换说明 现在C语言通过函数原型机制检查函数调用时参数的个书和类型是否正确,但是这对printf()和scanf()函数不起作用,原因是因为这个俩个函数的参数个数可变,如下:

int a=4;
int b=6;
float x=3.14f;   
float y=8.0f;
printf("%d\n",a,b);   //参数过多
printf("%d %d\n",a);  //参数过少
printf("%d %d\n",x,y); //转换说明类型不匹配

运行结果: C语言_格式化输入输出 用%d显示float类型的值,这个值不会被转成int类型,在不同的平台下面,运行结果也会导致不同

注意:通常3.14和8.0都会被编译器存储在64位的double类型中,使用双精度进行乘法运算,然后将乘积截断成float的快读,这样虽然计算精度更高,但无疑会减慢运行速度,我们不是在做非常精确的计算 ,所以不用那么精准,可以在浮点数后面加上F或f后缀就可以覆盖编译器默认的是指,编译器会将浮点类型常量看作float类型 ** 没有后缀的浮点常量是double类型。** 很显然这都不是我们想要的结果,所有的编译器都能编译并且运行这个程序,但是大部分的编译器都会给予警告,的确,有些编译器会捕捉到这类问题,但是c标准没有对此多要求,所以,计算机在运行时可能不会捕捉到这类错误,如果程序正常运行,很难察觉出来,大概只有程序没有打印出你所期望的或者意想不到的值的时候,你才会去检查prinf()函数中的参数类型和个数是否正确

收藏
评论区

相关推荐

C++概述
概述 C 是静态,可编译,通用,大小写敏感,格式自由的编程语言,它支持程序化,面向对象的,和泛型编程方式。 C 被看作是中间层语言,因为它同时包含了低级语言和高级语言的特性。 C 是于 1979 年在新泽西的茉莉山丘的贝尔实验室由 Bjarne Stroustrup 开发的,它是 C 语言的加强版,最开始它被称作 “C with Classes”,但是
C++ 基本语法
C 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 对象具有状态和行为。例如:一只狗的状态 颜色、名称、品种,行为 摇动、叫唤、吃。对象是类的实例。 类 类可以定义为描述对象行为/状态的模板/蓝图。 方法 从基本上说,一个方法表示一种行为。一个类可以包含多个
统计字符串中字符出现的次数(Python版)
字符串转list python s 'aabbccd' list1 list(s) 方法一: python list1 'a', 'a', 'b', 'c', 'c', 'c', 'c' dict_cnt {} for value in list1: dict_cntvalue dict_cnt.get(value,
C语言_格式化输入输出
C语言_格式化输入输出 我们知道在最开始输入输出的printf和scanf里可以用百分号跟上一个字母d 说明要整数的类型,%f说明要以浮点数输出 printf() %flagswidth.prechlLty
c++11 实现单例模式
C11出来后,里面新增加了好多好用的功能 下面的单例就是使用了C11中的标准库中的mutex和unique_prt 进行内存管理的. 此单例模式不用担心内存的释放问题 pragma once include <memory include <mutex template <class T class Singleton { public: ty
C语言_练习题(一)
前言: 看懂理解代码很容易,难的是把所理解的融会贯通,融合到实例中,你会发现事实和理论会有些许差别,编写实例能更好的帮你积累经验。 0x1 编写一个程序,要求提示输入一个ASCII码值(如,66),然后打印输入的字符。 代码: include <stdio.h int main(){ char i; printf("请输入一个ASCI
我的C语言基础
C语言32个关键字auto 声明自动变量short 声明短整型变量或函数int 声明整型变量或函数long 声明长整型变量或函数float 声明浮点型变量或函数double 声明双精度变量或函数char 声明字符型变量或函数struct 声明结构体变量或函数union 声明共用数据类型enum 声明枚举类型typedef 用以给数据类型取别名co
C语言基础习题50例(一)1-5
虎为百兽尊,罔敢触其怒。惟有父子情,一步一回顾。 习题1 有 1 、 2 、 3 、 4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?实现思路:显然,这个题目需要用到循环,并且是循环嵌套,先列出所有可能的组合,再去掉重复的组合即可。代码如下:cinclude <stdio.hint main(){ int i, j, k,
C语言基础习题50例(二)6-10
给大家推荐一门大数据Spark入门课程,希望大家喜欢。 习题6 用 号输出字母C的图案。实现思路:单行打印即可。代码如下:cinclude <stdio.h int main (void){ printf("\n"); printf("\n"); printf("\n"); printf("
C语言基础习题50例(三)11-15
你们看出神马了吗(\\^_\^\) 习题11 有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少实现思路:从第1个月起,兔子对数分别为1、1、2、3、5、8、13、21...,显然是斐波拉契数列。代码如下:cinclude<stdio.hint mai
C语言基础习题50例(四)16-20
给大家介绍一堂Python入门课,感觉还不错,适合初学者入门。 习题16 输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。实现思路:求两个数的最大公约数分别采用辗转相除法、辗转相减法、枚举法得到,最小公倍数用两个数之积除以最大公约数即可获得。方式一——辗转相除法:思路:(1)将两整数求余 a%b x;(2)如果x 0;则b为最大公
游戏安全实践的一些思考
移动的游戏能够稳定健康的上线。主要需要依赖以下在四个方面:1.前端展示,或者说客户端正常运行。性能稳定不崩溃,不过热能够稳定运行。2.后端,或者游戏后台服务端的。不但要稳定。还有能在有限的服务器资源下,能承受大量的同时在线用户。而且要让游戏中的每个模块都能够承受承受大量的同时在线用户。3.安全也是重点之中。这既包括客户端,又包括服务端。客户端的安全,包括要防
C语言中指针及其应用高级篇(用指针实现数组的扩增)
一、一级指针与一维数组把指针充当变量的用法,在C/C++的数据结构学习中广为应用,这种用法学习起来是比较简单的。先看代码。这里的代码,有string.h头文件包含的函数,和scanf,这两者在正常的写法中不用加“s”,这篇随笔所及代码的运行环境是Visual Studio2017,编译器会把scanf等函数增强,因此为了正常运行,会加上“s”.cdefine
计算(变量)
include <stdio.hint main() int price 0; printf ("请输入金额(元)"); scanf ("%d",&price); int change 100 price; printf ("找您%d元\n",change); return 0;上述程序编译执行的结果如下: $ cp
题解5道c++面试题第一期(含解题思路、答案解析和实现代码)
本篇文章送上5道c/c++面试题目,并附上答案、解题思路以及扩展知识。 1. 求下面函数的返回值c++include <stdio.hint func(int x) int iCnt 0; while(x) iCnt++; x x&(x1); return iCnt;int main() printf("cnt %d\n", func(9999