关于scanf和printf的学习内容如下:
二、C语言数据类型与变量(scanf和printf (1))
二、C语言数据类型与变量(scanf和printf (2))
二、C语言数据类型与变量(scanf和printf (3))
1.scanf( ) 常用的占位符
•
%c
:字符。
•
%d :整数。
•
%f
:
float
类型浮点数。
•
%lf
:
double
类型浮点数。
•
%Lf
:
long double
类型浮点数。
•
%s
:字符串。
•
%[]
:在方括号中指定一组匹配的字符(比如
%[0-9]
),遇到不在集合之中的字符,匹配将会
停止。
2.%d能在读取时忽略空白字符
1) %d格式输入,可以省略输入行代码的空格
//在我们输入数据的时候,不同的变量中间打空格,不然scanf就会读取成一个数
//在打了空格之后,scanf读取到空白字符,即停止对第一个整数的读取
//但当读取第二个数时,会忽略起首的空格
//在打了空格之后,scanf读取到空白字符,即停止对第一个整数的读取
//但当读取第二个数时,会忽略起首的空格
int main()
{
int a = 0;//初始化
int b = 0;//初始化
int c = 0;//初始化
scanf("%d%d%d", &a, &b, &c);
//在我们输入数据的时候,不同的变量中间打空格,不然scanf就会读取成一个数
//在打了空格之后,scanf读取到空白字符,即停止对第一个整数的读取
//但当读取第二个数时,会忽略起手的空格
printf("a=%d ,b= %d ,c= %d\n", a, b, c);
return 0;
}
对于%d输入的读取,会忽略整数前的空格示例,结果还是会读取到这个数:
int main()
{
int a = 0;//初始化
scanf("%d", &a);//输入" 200"//输入时在200前面加很多空格
printf("a=%d", a);
return 0;
}
2)printf格式化输出
我们可以看到我在printf那一行代码上不小心在b= 和c= 后面输入了空格,最后他输出的内容"a=1,b= 2,c= 3",中也带有空格,这就是格式输出,printf中的f的含义,format
只是在%d这里我们可以在格式输入这行代码中省略空格,当然,也可以加上空格
用户数据输入不打空格示例,被认为只输入了一个数:
3) %d格式输入
scanf("%d%d%d", &a, &b, &c);
scanf("%d %d %d", &a, &b, &c);
scanf("%d,%d,%d", &a, &b, &c);
int main()
{
int a = 0;//初始化
int b = 0;//初始化
int c = 0;//初始化
int d = 0;//初始化
int e = 0;//初始化
int f = 0;//初始化
int g = 0;//初始化
int h = 0;//初始化
int i = 0;//初始化
scanf("%d%d%d", &a, &b, &c);//需要输入的数据格式为1 2 3
scanf("%d %d %d", &d, &e, &f);//需要输入的数据格式为1 2 3
scanf("%d,%d,%d", &g, &h, &c);//需要输入的数据格式为1,2,3
scanf("%d-%d-%d", &g, &h, &c);//需要输入的数据格式为1-2-3
return 0;
}
2.%c 不忽略空白字符
上面所有占位符之中,除了
%c
以外,都会自动忽略起首的空白字符。
%c
不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
我们发现输入中的A与B中间的空格没有被跳过,并且空格被赋给了bob这个变量
int main()
{
char mary = 'A';//初始化
char bob = 'B';//初始化
char liming = 'O';//初始化
scanf("%c%c%c", &mary,&bob,&liming);//输入"A B O"
printf("mary'blood =%c, bob'blood =%c,liming'blood =%c,", mary,bob,liming);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/5c45a12d7fa54766a51dcf7b26510521.png)
强制跳过
如果想让其忽略,就写成如下格式,在%c前面加一个空格,表示强制跳过零个或者多个空白字符
scanf(" %c",&char);
强制跳过之后值被正确赋予
3.%s的使用
1)对于一个字符串,读取到空白字符(即空格、换行符、制表符等)后scanf会停止读取
scanf()
不适合读取可能包含空格的字符串
比如对于 this is an apple,只会读取到this
int main()
{
char arr[20] = {0};//初始化,arr这个数组的长度是最多是20
scanf("%19s", arr);
//数组无需取地址,%19s代表在输入的这一串中只读取19个字符,
//如果写成20会被认为有溢出风险,只能写19
printf("%s\n", arr);
return 0;
}
2)scanf的安全用法
详细解释见二、C语言数据类型与变量(scanf和printf (2))
int main()
{
char arr[20] = {0};//初始化,arr这个数组的长度是最多是20
scanf("%5s", arr);//数组无需取地址,%5s代表在输入的这一串中只读取5个字符
printf("%s\n", arr);
return 0;
}
4.赋值忽略符*
在之前的学习中,我们认识到只要我们没有按照scanf()中设定的格式输入,就会出现解析错误,如下,我们输入日期
int main()
{
int year = 0;
int month = 0;
int day = 0;
int r= scanf("%d-%d-%d",&year,&month,&day);
printf("date=%d年%d月%d日\n", year, month, day);
printf("r=%d\n", r);
return 0;
}
//输入2023-12-27,并且返回变量读取个数3,详细解释见
二、C语言数据类型与变量(scanf和printf (3)) scanf()的返回值
![](https://img-blog.csdnimg.cn/direct/2057ba98b5e148a88aa2b89badfb46b9.png)
//输入2023/12/27,出现了错误,只读取到了2023,到/这个符号后停止读取,返回的变量个数为1.
![](https://img-blog.csdnimg.cn/direct/81e40e3cb7c749b5bc3703de3ea5dfb8.png)
为了避免这种情况,
scanf()
提供了⼀个赋值忽略符(assignment suppression character)
*
。
只要把
*
加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
所以我们把日期中间的-和/变成%c形式,并写成%*c忽略该字符,这样不管输入的是-还是/,整数部分都能被正确读取,并且%c没有返回任何值。
int r= scanf("%d%*c%d%*c%d",&year,&month,&day);
![](https://img-blog.csdnimg.cn/direct/d11ecdabb84a4f50804e12bb03308dcb.png)