C语言_printf和scanf的学问

1. printf的学问

1.1 限定最小宽度

#include<stdio.h>
int main()
{
	printf("%6d", 123);// 输出为“   123”
	return 0;
}

printf() 允许限定占位符的最小宽度(:这里的宽度指的是输出内容占用屏幕空间的总宽度)。%6d表示这个占位符的宽度最少为6位。输出的值默认为右对齐。当输出内容不足6位时,会用空格补齐。如果想让输出的值为左对齐,则需要在%后加一个-。见下方代码:

#include<stdio.h>
int main()
{
	printf("%-6d", 123);// 输出为“123   ”
	return 0;
}

同理,浮点数也是如此,示例如下:

#include<stdio.h>
int main()
{
	printf("%10f", 1.23);// 输出为“   1.230000”
	return 0;
}

上方代码中,%10f表示输出的最少要有10位,由于占位符%f默认输出小数点后6位,所以1.23输出的值前方要有2个空格。

1.2 限定小数位数

#include<stdio.h>
int main()
{
	printf("%.2f", 0.2);// 输出为“0.20”
	return 0;
}

%.2f表示浮点数的小数部分只输出两位。
这种占位符可以与上方的限定宽度占位符,结合使用。如下方代码:

#include<stdio.h>
int main()
{
	printf("%6.2f", 1.2);// 输出为“  1.20”
	return 0;
}

%6.2f中,6表示最小宽度为6,2表示输出两位小数。

最小宽度小数位数这两个限定值,都可以用*代替,通过printf()的参数来传入。如下方代码:

#include<stdio.h>
int main()
{
	printf("%*.*d", 6, 2, 1.2);// 输出为“  1.20”
	return 0;
}

上⾯⽰例中, %*.*f 的两个星号通过 printf() 的两个参数 62 传⼊。

1.3 输出部分字符串

#include<stdio.h>
int main()
{
	printf("%.2s", Inverse);// 输出为 “In”
	return 0;
}

%s是字符串占位符,用来输出字符串,默认是全部输出。%后加了.2表示输出字符串的前两个字符。

2. scanf的学问

2.1 基本用法

scanf函数是C语言标准库中的一个函数,主要用于从标准输入读取数据(注: 标准输入一般指键盘,标准输入一般指屏幕),将一个值存储到指定地址中。如下方代码:

#include<stdio.h>
int main{
	int i = 0;
	int j = 0;
	scanf("%d %d", &i, &j);
	return 0;
}

此代码执行到scanf()时,程序会暂停等待用户输入数据。用户输入的数据根据格式字符串(“%d %d”)中指定的格式进行解析,并相应的存储到变量ij的地址中。
注:
变量前⾯必须加上&运算符(指针变量除外),因为scanf()传递的不是值,⽽是地址,即将变量 i 的地址指向用户输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加&运算符。

2.2 scanf的返回值

scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何变量,或者匹配失败,则返回0
如果在成功读取任何数据之前,发生了读取错误或者遇到读取文件结尾,则返回常量EOF(-1)
EOF - end of file 文件结束标志

2.3 赋值忽略符

赋值忽略符应用场景:当你知道输入中有一些不需要的数据,只想跳过它们去读取后面的数据时,就可以使用赋值忽略符

#include<stdio.h>
int main{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d-%d-%d", &year, &month, &day);
	printf("%d %d %d", year, month, day);
	return 0;
}

上方示例中,如果用户输入2022-02-02,就会正确解读年、月、日。当用户输入的格式与格式字符串("%d-%d-%d")不符时,比如2022/02/02scanf()解析数据就会失败。
为了避免在这种情况,scanf()提供了一种赋值忽略符*.只要把*加在占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。示例如下:

#include<stdio.h>
int main{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d%*c%d%*c%d", &year, &month, &day);
	return 0;
}

上方示例中,%c中插入了赋值忽略符*,表示这个占位符没有对应的变量,解读后不必返回。此时,无论是输入2022-02-02,还是输入2022/02/02scanf()都可以解析成功。

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值