目录
1.scanf()返回的是一个整数,表示成功读取的变量个数,如果没有读取任何任何项,或者匹配失败,则返回0
2.如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1),E0F -- end of file 文件结束标志
3.1%c不忽略空白字符,总是会返回当前第一个字符(不管是不是空格)。
3.2%s从当前的第一个非空白的字符读起,直到遇到空白字符(空格,制表符,换行符等)。
一.printf用法
1.基本用法
1.1printf()的作用是将参数文本输出到屏幕上,f(format)代表格式化的意思,表示可以输出文本的格式。
#include <stdio.h>
int main()
{
printf("hello,ereryone"); //输出hello,everyone
return 0;
{
这里应当注意,在使用printf()之前需要先引入头文件,因为printf是在标准库stdio.h里面定义的。
2.占位符
占位符指可以再这个位置用其他值代入
#include <stdio.h>
int main()
{
printf("there are %d apples",3);
return 0;
}
这里面的%d就是占位符,表示这个位置要用其他值来替换,%d表示代入的值为整数,这样的占位符有很多,在这里只列举常用的一些 :
占位符 | 含义 |
---|---|
%d | 十进制整数 |
%s | 字符串 |
%c | 字符 |
%f | 小数,包含float和double类型 |
%hd | 十进制short int |
%hu | unsigned short int 类型 |
%ld | 十进制long int 类型 |
%p | 指针 (用来打印地址) |
%x | 十六进制整数 |
%z | size_t类型 |
3.printf()限定宽度
3.1关于整数
即为printf()允许限定占位符的最小宽度,我们先来看一块代码
#include <stdio.h>
int main()
{
printf("%5d",1234); //输出为 1234
return 0;
}
这个代码输出的结果为 1234 。%5d的意思为这个占位符的最小宽度为5,如果不满5位,对应的值会在前面添加空格,因为输出的值默认为右对齐,如果希望改成左对齐,可以在占位符的%后面插入'-'号.
3.2关于小数
而对于小数,这个限定符会限制所有数字的最小显示宽度
#include <stdio.h>
int main()
{
printf("%12f",123.45); 输出 123.450000
return 0;
}
%12f表示输出的浮点数醉逍遥占据12位,由于小数默认显示精度为小数点后6位,所以会在123.45前面添加两个空格。同时我们还可以用%.2f来表示小数点后面只保留两位.
4.输出部分字符
%s占位符表示输出字符串,默认是全部输出,如果只希望部分输出,则可以用%.[m]s来指定输出的长度。
-
#include <stdio.h> int maini() { printf("%.5s","hello,linux"); //输出hello return 0; }
二.scanf函数
1.基本概念
scanf()函数用于读取用户的键盘输入,程序运行到这个语句时,会停下来,等待用户键盘输入,按下回车键后,scanf()会处理用户的输入,将其存入变量。要特别注意的是:scanf会自动过滤空白字符,包括空格,制表符,换行符.
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
int main() 12.3456$232
{
int x;
int y;
//用户输入
scanf("%d",&x);
printf("%d\n",x); //输出12
scanf("%f",&y);
printf("%f",y); 输出.3456
return 0;
}
在上述带代码中,x打印出来时12,因为读取到12后面的.不是整数,所以只打印.前面的,y表示的是浮点数,当第二次调用scanf的时候,会从上一次停止的地方,继续往下解读,当读取到$时停止,因为$不属于浮点数。
2.scanf的返回值
1.scanf()返回的是一个整数,表示成功读取的变量个数,如果没有读取任何任何项,或者匹配失败,则返回0
2.如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1),E0F -- end of file 文件结束标志
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> //scanf返回值示例
int main(){
int a = 0;
int b = 0;
float f = 0.2f;
int ret = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("ret=%d", ret); //ret表示变量return
return 0;
}
从上述代码我们可以看出返回值是3,表示成功读取3个变量个数.
3.占位符
scanf占位符和printf()基本一致,这里只说特殊的%c和%s.
3.1%c不忽略空白字符,总是会返回当前第一个字符(不管是不是空格)。
如果想要强制跳过字符前的空白字符,可以写成scanf(" %c",%ch),即在%c的前面加一个空格,表示跳过零个或者多个字符。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char a; char b; scanf("%c",&a); printf("a=%c\n",a); return 0; }
第一个输出第一个字符a, 第二个输出第一个字符 空格.
3.2%s从当前的第一个非空白的字符读起,直到遇到空白字符(空格,制表符,换行符等)。
#define _CRT_SECURE_NO_WARNINGS
#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\n", year, month, day);
return 0;
}
这个代码可以看出如果输入的格式不是%d-%d-%d,就无法正确打印后面的数,因此引出赋值返回值。
3.2.1:赋值返回值
为了解决3.2中代码解析失败的问题,scanf()提供了一个赋值返回值,只要把*放在任何占位符的百分号后面,该占位符就不会返回值,解析后会丢弃。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
只要在%后面加*号,这样就可以正确打印了。