详解printf 和 scanf

提示:在c语言中两个函数学习是必不可少的,输入和输出函数,接下来小编带大家去学习一下printf输出函数和scanf输入函数吧。

文章目录

  • 一、printf学习
    • 1、 printf的作用
    • 2、printf ()输出格式
  • 二、占位符学习
  • 三、scanf学习
    • 1、scanf的基本用法
    • 2、单组输入代码学习:输入学生成绩
    • 3、多组输入代码学习
    • 4、scanf处理用户输入的原理
    • 5、scanf的返回值
    • 6、特殊情况的占位符%c在scanf中的使用
    • 7、重点作为打印字符串的占位符%s
  • 四、总结


一、printf学习

1、 printf的作用

  1. printf()的作用将参数文本输出到屏幕,它的名字里面f代表format(格式化),表示可以定制输出文本的格式。
  2. printf()在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
#include   
int main()   
{
	printf("hello world\n");   
	return 0;   
}

注意:
printf()不会在行尾自动换行,运行结束后,光标就停留在输出结束的地方,不会自动换行。如果想换行,可以在文本后面加一个换行符\n

如果文本内部也有换行,也可以通过插入换行符来实现,如下方的代码:

#include
int main()
{
	printf("hello\nworld\n");
	return 0;
}

在这里插入图片描述

2、printf ()输出格式

提示:学习这个内容,参考后面讲述内容占位符加以理解

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

1,限定宽度

printf()允许限定占位符的最小宽度

int main()
{
	printf("%5d\n",123);
	return 0;
}

详解printf 和 scanf_第1张图片

分析

上面的案例中,%5d表示这个占位符的宽度至少为5位。如果不满足5位,少了几位就在要输出的数前面用空格补齐。%5d表示输出的值默认为右对齐,即输出内容前面会有空格;如果希望改成左对齐,即在输出内容后面添加空格,可以在写成%-5d,在%后面加负号即可。但是我们如果打印七位的话就会直接打印七位,而不是五位,所以我们这里说的是限定他的最小宽度。

int main()
{
	printf("%12f",123.45);
	return 0;
}

在这里插入图片描述

分析:对于小数,这个限定符会限制所有数字的最小显示宽度

当用%f打印小数小数点后面默认打印六位,上面123.45小数点后面是45,不够六位补上四个0;在这里我们用%12f来打印,需要它小数整数部分包括后面的0输出一共要打12位,如果不满足12位,则在前面用空格补上。

2,显示正负号

默认情况下,printf ()不对整数显示+号,只对负数显示-号,这里只要在%后面加一个正号就可以显示正号了。

int main()
{
	printf("%+d", 123);
	return 0;
}

在这里插入图片描述

3,限定小数位数

输出小数时,有时希望限定小数的位数,举例来说,希望小数点后面只保留两位,占位符可以写%.2f,但是会四舍五入的。

int main()
{
	printf("%.2f", 123.45562);
	return 0;
}

在这里插入图片描述

分析:
在这里可以发现小数点后面只打印了两位,这是因为占位符限定了它的小数位数后面只存在两位。这种限定小数位数占位符可以与限定宽度占位符结合一起使用。

4,输出字符串

%s输出字符串默认是全部输出,如果只想输入开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。

int main()
{
	printf("%.5s\n", "hello world");
	return 0;
}

在这里插入图片描述

分析:
在这里前面输出文本占位符为%.5s,表示输出五个字符,所以只打印hello。


二、占位符学习

所谓占位符,就是这个位置可以用其他值植入

案例一: 占位符:%d

int main()
{
	printf("%d个和尚有水喝,%d个和尚没水喝\n",1,3);
	return 0;
}

详解printf 和 scanf_第2张图片

上面的案例中,双引号引起来的是输出文本,里面的%d就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为%,第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。所以printf的后面两个参数1,3就是替换占位符的值。

案例二:占位符:%s

int main()
{
	printf("%s的成绩是100\n", "张三");
	return 0;
}

详解printf 和 scanf_第3张图片

在上面的案例中,%s表示代入的是一个字符串,所以printf()的第二个参数就必须是字符串,张三就是字符串替代前面的输出文本中的%s。执行后输出为“张三的成绩是100”。

案例三: 多个占位符

int main()
{
	printf("%s的成绩是%d\n", "张三",100);
	return 0;
}

详解printf 和 scanf_第4张图片

在上面的案例中,输出文本中的占位符%s对应第二个参数张三,占位符%d对应第三个参数100,它们之间是一一对应关系,如果有n个占位符,printf()的参数就因该有n+1个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。


三、scanf学习

1、scanf的基本用法

1,scanf ()用于读取用于的键盘输入,当程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据,按下回车键后,scanf就会处理用户的输入,将其存入变量里面。
2,scanf在使用时需要包含头文件,它的头文件是stdio.h
3, scanf和printf的语法类似
4, scanf第一个参数是一个格式字符串,里面放着占位符,告诉编译器如何解读用户的输入,需要提取的数据是什么类型。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。

2、单组输入代码学习:输入学生成绩

int main()
{
	int score = 0;
	printf("请输入学生成绩:");
	//输入
	scanf("%d",&score);
	//输出
	printf("学生成绩为:%d",score);
	return 0;
}

详解printf 和 scanf_第5张图片

分析:
scanf在输入的时候也有占位符,首先要指定一个占位符,上面代码写的是%d,表示我要输入一个整型的值,输入的整数我们要放到score里面去,但是scanf要把输入的值放在哪里去呢,就像我们送外卖的,你首先要给你人家地址你才能把外卖送过去吧,所以我们这里要获取score的地址,然后给他送过去,但是怎么获得它的地址呢?这里我们就需要用到取地址符&了,通过取地址符来获取score的地址,把scanf输入的值放到score里面去。

3、多组输入代码学习

int main()
{
	int x, y, j, k = 0;
	scanf("%d%d%d%d",&x,&y,&j,&k);
	printf("%d %d %d %d", x, y, j, k);
	return 0;
}

详解printf 和 scanf_第6张图片

详解printf 和 scanf_第7张图片

详解printf 和 scanf_第8张图片

分析:
在上面代码中给大家演示了不同的占位符模板输入的情况,最上方的代码占位符之间没有任何间隔,第三张图占位符之间加了空格,第四张图加了换行符,但是我们在键盘上输入的时候,**scanf处理占位符时,会自动过滤空白字符,包括空格,制表符,换行符等**。而我们在输入的时候上方小编也演示了不同的输入方式,我们**输入的数据之间,有一个或者多个空格不影响scanf解读数据,scanf在解读数据将空格跳过,另外在我们使用回车键的时候,将输入分成几行,也不影响解读**

4、scanf处理用户输入的原理

scanf()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。

int main()
{
	//假设我们这里输入的值是   123.456#125
	int x = 0;
	float y = 0;
	scanf("%d",&x);
	printf("%d\n",x);
	scanf("%f", &y);
	printf("%f", y);
	return 0;
}

详解printf 和 scanf_第9张图片

分析:
在这个代码中我们输入:空格空格 123.456#125 ;然后scanf 解读空格直接跳过,继续往下执行遇到第一个数子1,就开始执行第一个%d的解读,但是当他遇到小数点的时候,欸跟那个第一个要输入的类型不同,于是从小数点开始他就执行代码将值放入y中直到遇到#,判断到这个不是数字,停止解读,所以x的值为123,y的值为0.456000;

5、scanf的返回值

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

详解printf 和 scanf_第10张图片

在这里用代码来演示一下:

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int d = scanf("%d%d%d", &a, &b, &c);
	printf("a=%d\nb=%d\nc=%d\n",a,b,c);
	printf("%d",d);
	return 0;
}

详解printf 和 scanf_第11张图片

没有任何数据读取如下图:返回值为0
详解printf 和 scanf_第12张图片

读取错误或者遇到文件结束末尾:返回值为-1
详解printf 和 scanf_第13张图片

6、特殊情况的占位符%c在scanf中的使用

1,上面的占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。下面代码演示:

整型变量输入输出:
详解printf 和 scanf_第14张图片
字符型变量输入输出

详解printf 和 scanf_第15张图片

分析:

在这里其他类型变量输入的时候可以直接跳过空白字符来到它要的相应类型的位置,而字符型变量输入的时候不会忽略空白字符,因为空白字符也是字符因此在输入的时候他不会忽略空白字符,而是把它也计算在内,就如上图,我们是想要打印字符a,但是前面有空白字符所以我们打印的也是空白字符。

2,如果想要强制跳过字符前的空白字符,可以写成scanf(" %c",&ch),即% c前加一个空格,表是跳过零个或多个空白字符。

详解printf 和 scanf_第16张图片

7、重点作为打印字符串的占位符%s

下面要特别说一下占位符%s,它不能等同于字符串,它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格,换行符,制表符等)为止。因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用,这也意味着,scanf()不适合读取包含空格的字符,另外scanf()遇到%s占位符,会在字符串变量末尾存储一个空白字符’\0’。

详解printf 和 scanf_第17张图片

详解printf 和 scanf_第18张图片

分析:

在这里printf识别占位符只有遇到’\0’才停止,所以把后面的内存空间所占的字符也打印出来了

详解printf 和 scanf_第19张图片

分析:

在这里系统报错是因为原先数组内存的是abcde这五个字符,然而用%s输入的时候却会在字符串变量末尾加上一个空字符’\0’,表示字符串的结尾。导致数组超出了的范围,数组越界而出现错误。

所以scanf()在将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以在存储字符串的时候,很可能会超出数组的边界,导致预先不到的结果。为了防止这种情况出现,使用占位符%s时,因该指定字符串的最大长度,即写成%[m]s,其中[m]表示一个整数,表示读取字符串的最大长度,后面的字符也将被丢弃。

详解printf 和 scanf_第20张图片

分析:

上面示例中,我们之后scanf输入字符串会在后面加上一个\0,arr是一个长度为5的字符串,scanf占位符%4s表示最多读取用户输入的4个字符,后面的字符将被丢弃,这样就不会出现上面那样的报错了,不存在数组溢出的风险。


四、总结

在这里就已经将所有有关于printf和scanf的知识学完啦,如果对你有所帮助请记得给小编点个赞鼓励一下

详解printf 和 scanf_第21张图片

你可能感兴趣的:(c语言,学习)