Lesson 3scanf&printf,分支语句,关系操作符

本文介绍了C语言中的两个重要函数:scanf和printf。scanf用于从键盘读取用户输入并赋值给变量,printf则用于将格式化的文本输出到屏幕。文章详细讲解了它们的使用方法,包括占位符、输出格式定制以及与变量的对应关系。同时,还涉及了if语句的基础知识和关系操作符的使用。

scanf&printf

简单介绍scanf和printf。

printf

是库函数,需要引用头文件stdio.h。printf的作用是将参数文本输出到屏幕。f代表format。printf不会在末尾添加换行符。需要换行时,可以在需要换行的位置添加\n。以下代码:

#include <stdio.h>
int main()
{
	printf("Hello World!\n");
	return 0;
}

会在屏幕上打印Hello World!并且切换至新行。

占位符

printf可以在输出的文本中添加占位符,所谓占位符,代表这个位置可以用其他值输入。
看一段代码:

#include <stdio.h>
int main()
{
	printf("%d + %d = %d\n",3,5,8);
	return 0;
}

会打印3+5=8。代码中的%d代表这个位置可以被一个整数占位。占位符的第一个字符一律是%。printf中参数与占位符是对应的关系,如果有n个占位符,printf()的参数就应该有n+1个。
一些常用的占位符:

名称功能
%d整数占位符
%s字符串占位符
%f浮点数占位符
%p指针占位符

输出格式

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

printf("%5d\n",123);

输出为__123(_表示空格,下同)。这里数据宽度指定为5位,但123只有3位,printf会在123之前补空格输出(因为默认是右对齐)。

printf("%-5d\n",123);

这里就会改成左对齐。输出的是123__。下面看一下小数部分。

printf("%12f\n",123.45);

小数默认显示精度是小数点后6位,这里12f表示这个浮点数输出一共占12位(包括小数点)。那么实际输出会是:__123.450000。
printf对于正数是不显示+的,需要显示时,在%之后加上即可。负数会显示-。

printf("%+d\n",12);

这里会打印+12。如何显示限定的小数位数呢?如果仅想保留小数点后3位,应该写成%.3f。这里注意,如果浮点数的位数超过想保留的位数,会四舍五入处理。例如:

printf("%.2f",12.3456);

会打印12.35。浮点数也可以结合上面的限制宽度一起使用:

printf("%6.2f",1.5);

会打印__1.50。整体的宽度是6,小数点后保留2位,因此在1之前补2个空格。最小宽度和小数位数这两个限定值可以使用*代替,然后通过printf的参数传入:

printf("%*.*\n",6,2,1.5);

结果与直接输出%6.2f 是一样的。

scanf

这个函数可以给变量赋值。在我们需要给创建的变量赋值的时候就可以使用这个函数。scanf()用于读取键盘输入。用户通过键盘输入数据并按下回车后,scanf会处理数据,将其存入变量。scanf也是库文件,需要stdio支持。scanf与printf的语法类似。看下面的代码:

scanf("%d",&i);

由于C语言数据都是有类型的,因此scanf必须知道用户输入的数据类型。上述代码表示用户需要输入一个整数来存放在变量i里面。由于scanf是传址的,因此需要在使用&i来取出i的地址。但如果变量是指针,那么就不需要&。
scanf()在处理数值占位符时,会自动过滤空白字符、包括空格、制表符、换行符等。用户在输入数据的时候,有一个或多个空格是不影响scanf解读数据的。

scanf("%d%d%f%f",%a,&b,&c,&d);

输入类似:

1
-20
3.4
-4.0e3

和:

1 -20 3.4 -4.0e3

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

//输入-13.45e12# 0
int x;
float y;
scanf("%d",&x);
scanf("%f",&y);

这里,x的值是-13,y值是.45e12;这是因为,第一个占位符是%d,那么scanf会从-号开始读取,读完-13结束。第二次调用scanf的时候,会从小数点处读起,读取到.45e12结束。后面的#和0还有空格都不是数值,因此会停在#这里。

scanf的返回值

scanf会返回一个整数,值是其成功读取到变量的个数。如果没有读取到任何项,或者匹配失败,会返回0。如果发生了读取错误或者遇到了文件末尾,通常返回常量EOF(-1)。

scanf的占位符

与printf类似。需要注意的是,除了%c之外,都会自动忽略起首的空白字符%c不忽略空白字符,总是返回当前第一个字符,因为空格本身就是字符。
如果需要%c强制跳过字符前的空白,可以写成scanf(“ %c”,&ch);,这样表示跳过一个或多个空白字符。
另外需要注意%s。它的跪着是从当前第一个非空白字符开始读起,直到遇到空白字符(空格、换行、制表符等)为止。由于%s不包含空格,因此不能用于读取多个单词,除非使用多个%sscanf()遇到%s,会在字符串变量末尾存储一个\0
scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。为了防止越界,应该指定读入字符串的最长长度,写成%[m]s。举个栗子:

char name[11];
scanf("%10s",name);

由于会有一个\0,因此name的最大长度是10。

赋值忽略符

int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d",&year,&month,&day);

如果用户输入2020-01-01是可以正确识别年月日的。问题时用户可能输入2020/01/01,scanf会解析失败。为了避免这种状况,参考如下代码:

int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d",&year,&month,&day);

其中的%*c就是赋值忽略符。

if语句

C语言分为顺序结构、选择结构、循环结构。现在仅介绍if

if

if (experssion)
  blablabla;

表达式为真(非0),执行下面的语句,否则跳过下面的语句。
举个例子:

int num = 5if(num % 2 == 1)
	printf("ODD");

这里if做判断,num%2 是否是1,是的话打印ODD。

else

配合if使用:

if (experssion)
  exp1;
else
  exp2;

上述代码表示,当experssion非0(为真)时,执行exp1,为0(为假)时执行exp2。

分支包含多条语句

由于if 和 else仅控制一条语句,需要控制多条语句时,要使用{}将多条语句括起来即可。

int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18) //if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
 {
 printf("Adult\n");
 printf("Girlfriend\n");
 }
 return 0;
}

嵌套if

多个if…else可以嵌套使用。看一下代码:

int main()
{
	int score = 0;
	scanf("%d", &score);
	if (score >= 90 && score <= 100)
		printf("A");
	else if (score >= 80 && score < 90)
		printf("B");
	else if (score >= 70 && score < 80)
		printf("C");
	else if (score >= 60 && score < 70)
		printf("D");
	else if (score >= 0 && score < 60)
		printf("E");
	else
		printf("非法成绩!");

	return 0;
}

悬空else

如果有多个ifelseelse总是和最接近的if匹配。

关系操作符

关系操作符是用来比较大小的。主要有:

符号功能
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

关系表达式通常返回0或者1,表示真假。
例如20>12返回1,12>20返回0

注意: ===是不一样的,前者是判断是否相等,后者是赋值。
代码if(x=3)将永远为真,因为x=3是赋值,其返回值是3。为了避免这种情况,通常我们需要写成:
if(3==x), 因为if(3=x)是非法的(不能赋值给常量3)。
另外,多个关系运算符不宜连用。

int a,b,c;
a = 8;
b = 10;
c = 4;
if(a<b<c)
	exp1

上面的exp1会执行,因为a<b是成立的。正确的写法应该是:

if(a<b && b<c)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值