【C语言篇】详细解释:转换字符%d和--d前面加不同数字时的意义和作用

257 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

🙇‍♀️写在前面的话:

这个文章主要讲解%d的用法,会由两个题目引入,进而分析和总结%d的d前面加不同数字(整数、小数)情况下的用法和作用。


🌎引入--2个题目:

题目1:

image.png

#define _CRT_SECURE_NO_WARNINGS 1

int main()
{
	int x = 0;
	float y = 0;

	scanf("%3d%f", &x, &y);
	printf("%d %f\n", x, y);


	return 0;
}

这个题目的结果是C:123

image.png

题目2:

image.png

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a = 1234;
	printf("%2d\n", a);

	return 0;
}

这个题目的答案是A:1234

image.png

对比:

当时,我和 一位同学对这两个题目的疑问是:第二个题目不应该输出结果是“12”吗。因为根据我们之前对%d浅显的理解是:d前面加整数,限制了输出字符数量,换句话来说,限制了在屏幕上输出的宽度。 其实,要弄清楚这个问题,要明白以下几点: 🅰:d前面的整数和实际字符数的大小关系。

🅱:经过格式化修饰的%d是在scanf函数内还是在printf函数


·第一个题目中,%d前面的数字3是小于实际字符数的,而且%3d是存在与输入函数scanf函数内的。 那么%d前面的整数,==限制了编译器读取整数的字符数量==(只从左向右读取三个整数字符)。 所以,x的值是123(为12345的前三个字符) 🆚 ·第二个题目中,%d前面的数字2也是小于实际字符数的,而且%2d是存在于输出函数printf函数内的。 那么%d前面的整数,==限制了输出在屏幕上的字符数量(宽度)== 但是注意:❗❗❗ 2是小于4的,按理来说应该应该输出2对吧?其实不然。 printf函数内%d格式化修饰时,并不是所有时候都能发挥作用,只有当d前面的数字是大于实际字符数时,才“发挥作用“(右对齐,左边补空格,这个下面会详细演示和讲解)。 在printf函数内:当d前面的整数小于实际字符数时,d前面的数字表示==至少==输出这么多个字符(并不是至多)。 所以,输出的结果是1234,而不是12.

💦分析d前加数字不同情况时的意义

这里用代码演示一下

🅰:printf函数内存在%md时: m<实际字符数时:是==至少==输出m个,不是表示只能输入m个!!!(这个时候m其实不发挥作用)

image.png m>实际字符数时: image.png 🅱:scanf函数内存在%md时: m<实际字符数时:这个表示的才是==至多==(编译器至多读取m个字符)。

image.png m>实际字符数时:因为表示的是==至多==,所以这个其实也不会发挥作用。

image.png

🌇总结:

1,⭐%d前面加整数(%md)

·scanf(输入)内:

1,m>实际字符数 m不发挥作用,无影响 2,m<实际字符数(==至多==读取m个) m发挥作用,编译器从左向右读取m个数字字符

·printf(输出)内:

1,m>实际字符数 m发挥作用,在屏幕上输出字符的宽度为m个字符,并且==右对齐==(如果m为负整数,那么左对齐,右边填充空格),不够的话左边补空格。 2,m<实际字符数(==至少==输出m个) m不发挥作用(有没有m都一样)。

2,补充:⭐%d前面加小数

假设:(%m.nd) printf内: 右对齐,占m个字符空间(空格填充),n个有效数字(不足填0) eg:

image.png


写在后面的话: 这篇是通过学习、请教他人,再加上经过自己的一些反思和理解,整理而写成的。其中可能有一些不准确的地方或者理解不深入的地方,还请大家多多指正!希望能对大家遇到相似问题时有所帮助!😉