二、C语言数据类型与变量(scanf和printf (4)完)

 关于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读取到空白字符,即停止对第一个整数的读取
//但当读取第二个数时,会忽略起首的空格
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;
}

强制跳过

如果想让其忽略,就写成如下格式,在%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()的返回值

//输入2023/12/27,出现了错误,只读取到了2023,到/这个符号后停止读取,返回的变量个数为1.
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) *
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
所以我们把日期中间的-和/变成%c形式,并写成%*c忽略该字符,这样不管输入的是-还是/,整数部分都能被正确读取,并且%c没有返回任何值。
	int r= scanf("%d%*c%d%*c%d",&year,&month,&day);
  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林采采学编程+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值