C语言学习过程总结(5)——输入和输出

哈喽呀,大家好,博主有来更新啦

C语言的学习已经开始逐渐深入,但大家要知道C语言不会是终点,他只是计算机学习的一个工具和起点,和博主一起努力吧!

1.printf和scanf介绍

1.printf()

其作用就是将文本输出到屏幕,f代表着format(格式化),表示可以定制输出文本的格式

这个函数在我们一开始的学习中就知道了

这是博主第一篇博客中自我介绍中的部分其中就运用到了printf函数

#include<stdio.h>
int main() {
	printf("Hello World");
	return 0;
}

上诉就是最简单的一个打印函数,打印Hello World

换行符

printf()并不会自动换行,运行结束光标就留在了输出结束的地方,如果需要换行就要在文本结尾加上换行符\n

下面的代码演示中体现了文本末尾换行和文本中换行

#include<stdio.h>
int main() {
	printf("Hello World");
	printf("Hello World\n");
	printf("Hello\nWorld");
	return 0;
}

从结果可以看出,第一次打印没有换行符,第二个Hello world的打印紧跟其后,而第三个Hello world因为前面的换行符就到了下一行去打印,并且因为文本中的换行符使得两个单词也换行打印。

注意:printf()函数在stdio.h都文件中被定义,所以使用其前一定要声明

占位符 

顾名思义,在这个地方用其他值代入

#include<stdio.h>
int main() {
	printf("小明%d岁了", 5);
	return 0;
}

 这里的%d就是占位符,使用后面的5来替换这个位置

当然也不会只有这个占位符,%d表示十进制整数,当然也会有字符和其他类型的数据,就需要各种各样的占位符

• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号。

重点注意一下标红的比较常见

注意!

printf()参数与占位符是一一对应的关系,n个占位符就有n+1个参数

printf第一个参数是一个字符串

printf("%d, %d", a, b); 两个占位符,但是printf有三个参数

用,隔开的三个内容地位是对等,都是printf的参数 

输出格式

printf()可以定制占位符的输出格式

限定宽度

这个在九九乘法表中就提到了。

%2d

d前面的数字表示占位符的宽度至少为几位,如果不满,就会在值的前面添加空格,默认是右对齐,就是值的前面有空格,当然用上%-2d就是左对齐了,内容的后面加空格

#include<stdio.h>
int main() {
	printf("%5d\n",123);
	printf("%-5d\n", 123);
	return 0;
}

说完对于整数,还有对于浮点数也就是小数

#include<stdio.h>
int main() {
	printf("%12f\n", 123.45);
	printf("%8f\n", 123.45);
	return 0;
}

%12f就意味着数值需要占12位

123.450000  很显然是10位,所以在前面补充了两个空格

如果说限定的最大宽度小于数值本身长度,就会打印完整数值,例如用%8f去限制123.45,打印的依旧是123.450000

补充:

我们可以通过在%后加上+,%+d使得printf在输出正数的时候加上+

限定小数位数

%.2f

#include<stdio.h>
int main() {
	printf("%.2f\n", 0.5);
	printf("%.5f\n", 0.5);
	printf("%.2f\n", 0.5201314);
	return 0;
}

三个例子,一目了然!

限定宽度占位符和限定小数位占位符结合使用

#include<stdio.h>
int main() {
	printf("%3.2f\n", 0.5);
	printf("%6.5f\n", 0.5);
	printf("%*.*f\n", 6, 5, 0.5);
	return 0;
}

%*.*f

看起来好像颜文字,这个两个星号可以让限定作用的数字变成参数传入,这就大大增加了指定格式的丰富性

%.5s

可以用来限定字符串的长度

2.scanf

只要是使用vs的同学,就一定会遇见一个问题,直接用scanf是会报错的,vs认为这个并不是一个安全的函数,如果用scanf_s就不会报错,但scanf_s又只有vs认识,会大大降低代码的可移植性

下面是两张博主的笔记截图,大概的解释了一下为什么vs会认为scanf不安全,以及永久的解决办法,笔记比较简单,后续博主会专门教大家解决的

scanf("%d",&i);

上面的图片包含了scanf的基本用法,这里博主就不在赘述了

有一些注意的点

*C语言数据都有类型,scanf()必须提前知道用户输入的数据类型才能处理数据

通过第一个参数“ ”内的内容就可以知道数据类型

%d就是整数 %f就是浮点数......

*变量前面必须加上&运算符(指针除外),因为scanf()传递的不是值,而是地址

scanf("%d%d%f%f", &i, &j, &x, &y); 

传递多个变量

*scanf()在处理数据的时候会自动过滤空白字符,包括空格、制表符、换行符等 

 scanf() 开始解读,如果第⼀⾏匹配第⼀个占位符,那么下次按下回⻋键时,就会从第⼆个占位符开始解读。

scanf() 处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。

解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。

例:

返回值

scanf()的返回值是一个整数,表示成功读取变量的个数


#include<stdio.h>
int main() {
	int a = 0;
	int b = 0;
	float c = 0.0;
	int r = scanf("%d %d %f", &a, &b, &c);
	printf("a=%d b=%d c=%f\n", a, b, c);
	printf("r = %d\n", r);
	return 0;
}

如果我们使用ctrl+z提前结束输入又会怎么样呢?

#include<stdio.h>
int main() {
    int a = 0;
    int b = 0;
    float c = 0.0;
    int r = scanf("%d %d %f", &a, &b, &c);
    printf("a=%d b=%d c=%f\n", a, b, c);
    printf("r = %d\n", r);
    return 0;
}

可以看到,r的结果变成了2,意味着只有两个数据成功输入

占位符

和printf的占位符大致一样

• %c :字符。

• %d :整数。

• %f : float 类型浮点数。

• %lf : double 类型浮点数。

• %Lf : long double 类型浮点数。

• %s :字符串。

• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。

上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。

 %c 不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。

如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。

占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。

也是因为%s不会包含空白字符,所以其不能读取含有空格的字符串,如:hello world

赋值忽略符

输入2023-10-21时如果输入成了2023/10/21,scanf就会解析失败

为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

#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语言中最重要的两个函数,printf和scanf

关于scanf的报错一劳永逸的解决方法明天博主就会给大家发详细的教程,敬请期待! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值