一,printf
1,printf的作用
- printf()的作用是将参数文本输出到屏幕,它的名字里面f代表format(格式化),表示可以定制输出文本的格式。
- printf()在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
注意:
printf()不会在行尾自动换行,运行结束后,光标就停留在输出结束的地方,不会自动换行。如果想换行,可以在文本后面加一个换行符\n
如果文本内部也有换行,也可以通过插入换行符来实现,如下方的代码:
#include<stdio.h>
int main()
{
printf("hello\nworld\n");
return 0;
}
2,printf()输出的格式
1,限定宽度
printf()允许限定占位符的最小宽度
#include<stdio.h>
int main()
{
printf("%5d\n",123);
return 0;
}
运行结果
上面的案例中,%5d表示这个占位符的宽度至少为5位。如果不满足5位,少了几位就在要输出的数前面用空格补齐。%5d表示输出的值默认为右对齐,即输出内容前面会有空格;如果希望改成左对齐,即在输出内容后面添加空格,可以在写成%-5d,在%后面加负号即可。但是我们如果打印七位的话就会直接打印七位,而不是五位,所以我们这里说的是限定他的最小宽度。
#include<stdio.h>
int main()
{
printf("%12f",123.45);
return 0;
}
运行结果
总结:对于小数,这个限定符会限制所有数字的最小显示宽度
当用%f打印小数小数点后面默认打印六位,上面123.45小数点后面是45,不够六位补上四个0;在这里我们用%12f来打印,需要它小数整数部分包括后面的0输出一共要打12位,如果不满足12位,则在前面用空格补上。
2,显示正负号
默认情况下,printf ()不对整数显示+号,只对负数显示-号,这里只要在%后面加一个正号就可以显示正号了。
#include<stdio.h>
int main()
{
printf("%+d", 123);
return 0;
}
运行结果
3,限定小数位数
输出小数时,有时希望限定小数的位数,举例来说,希望小数点后面只保留两位,占位符可以写%.2f,但是会四舍五入的。
#include<stdio.h>
int main()
{
printf("%.2f", 123.45562);
return 0;
}
运行结果
总结:在这里可以发现小数点后面只打印了两位,这是因为占位符限定了它的小数位数后面只存在两位。这种限定小数位数占位符可以与限定宽度占位符结合一起使用。
4,输出字符串
%s输出字符串默认是全部输出,如果只想输入开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。
#include<stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
运行结果
总结:在这里前面输出文本占位符为%.5s,表示输出五个字符,所以只打印hello。
三,scanf
1,scanf的基本使用
-
scanf ()用于读取用于的键盘输入,当程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据,按下回车键后,scanf就会处理用户的输入,将其存入变量里面。
- scanf在使用时需要包含头文件,它的头文件是stdio.h。
- scanf和printf的语法类似
- scanf第一个参数是一个格式字符串,里面放着占位符,告诉编译器如何解读用户的输入,需要提取的数据是什么类型。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
2、单组输入代码学习:输入学生成绩
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入学生成绩:");
//输入
scanf("%d",&score);
//输出
printf("学生成绩为:%d",score);
return 0;
}
运行结果
总结:
scanf在输入的时候也有占位符,首先要指定一个占位符,上面代码写的是%d,表示我要输入一个整型的值,输入的整数我们要放到score里面去,但是scanf要把输入的值放在哪里去呢,就像我们送外卖的,你首先要给你人家地址你才能把外卖送过去吧,所以我们这里要获取score的地址,然后给他送过去,但是怎么获得它的地址呢?这里我们就需要用到取地址符&了,通过取地址符来获取score的地址,把scanf输入的值放到score里面去。
3、多组输入代码学习
#include <stdio.h>
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;
}
运行结果
总结:
在上面代码中给大家演示了不同的占位符模板输入的情况,最上方的代码占位符之间没有任何间隔,第三张图占位符之间加了空格,第四张图加了换行符,但是我们在键盘上输入的时候,scanf处理占位符时,会自动过滤空白字符,包括空格,制表符,换行符等,也就是scanf遇到空格就不读取了。而我们在输入的时候上方小编也演示了不同的输入方式,我们输入的数据之间,有一个或者多个空格不影响scanf解读数据,scanf在解读数据将空格跳过,另外在我们使用回车键的时候,将输入分成几行,也不影响解读。
4、scanf处理用户输入的原理
scanf()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
#include <stdio.h>
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;
}
运行结果
总结:
在这个代码中我们输入:空格空格 123.456#125 ;然后scanf 解读空格直接跳过,继续往下执行遇到第一个数子1,就开始执行第一个%d的解读,但是当他遇到小数点的时候,欸跟那个第一个要输入的类型不同,于是从小数点开始他就执行代码将值放入y中直到遇到#,判断到这个不是数字,停止解读,所以x的值为123,y的值为0.456000。
5、scanf的返回值
scanf()的返回值是一个整数,表示读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回零。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
#include <stdio.h>
int main() {
int a = 0;
int b = 0;
int c = 0;
// 提示用户输入
printf("请输入三个整数(以空格分隔):");
// 尝试读取三个整数
int result = scanf("%d%d%d", &a, &b, &c);
// 检查 scanf 的返回值
if (result != 3) {
// 如果没有成功读取三个整数,返回 -1
printf("输入错误,返回值为 -1\n");
return -1; // 返回 -1
}
// 输出读取的值
printf("a = %d\nb = %d\nc = %d\n", a, b, c);
printf("scanf 返回值: %d\n", result);
return 0;
}
输入有效数据
无数据输入
错误输入
6、特殊情况的占位符%c在scanf中的使用。
1,上面的占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
总结:在这里其他类型变量输入的时候可以直接跳过空白字符来到它要的相应类型的位置,而字符型变量输入的时候不会忽略空白字符,因为空白字符也是字符因此在输入的时候他不会忽略空白字符,而是把它也计算在内,就如上图,我们是想要打印字符a,但是前面有空白字符所以我们打印的也是空白字符。
2,如果想要强制跳过字符前的空白字符,可以写成scanf(” %c”,&ch),即% c前加一个空格,表是跳过零个或多个空白字符。
没有回复内容