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不包含空格,因此不能用于读取多个单词,除非使用多个%s。scanf()遇到%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 = 5;
if(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
如果有多个if和else,else总是和最接近的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)
本文介绍了C语言中的两个重要函数:scanf和printf。scanf用于从键盘读取用户输入并赋值给变量,printf则用于将格式化的文本输出到屏幕。文章详细讲解了它们的使用方法,包括占位符、输出格式定制以及与变量的对应关系。同时,还涉及了if语句的基础知识和关系操作符的使用。
1050

被折叠的 条评论
为什么被折叠?



