提示:在c语言中两个函数学习是必不可少的,输入和输出函数,接下来小编带大家去学习一下printf输出函数和scanf输入函数吧。
- printf()的作用是将参数文本输出到屏幕,它的名字里面f代表format(格式化),表示可以定制输出文本的格式。
- printf()在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源代码头部引入这个头文件。
#include
int main()
{
printf("hello world\n");
return 0;
}
注意:
printf()不会在行尾自动换行,运行结束后,光标就停留在输出结束的地方,不会自动换行。如果想换行,可以在文本后面加一个换行符\n
如果文本内部也有换行,也可以通过插入换行符来实现,如下方的代码:
#include
int main()
{
printf("hello\nworld\n");
return 0;
}
提示:学习这个内容,参考后面讲述内容占位符加以理解
printf()可以定制占位符的输出格式
1,限定宽度
printf()允许限定占位符的最小宽度
int main()
{
printf("%5d\n",123);
return 0;
}
分析 |
上面的案例中,%5d表示这个占位符的宽度至少为5位。如果不满足5位,少了几位就在要输出的数前面用空格补齐。%5d表示输出的值默认为右对齐,即输出内容前面会有空格;如果希望改成左对齐,即在输出内容后面添加空格,可以在写成%-5d,在%后面加负号即可。但是我们如果打印七位的话就会直接打印七位,而不是五位,所以我们这里说的是限定他的最小宽度。
int main()
{
printf("%12f",123.45);
return 0;
}
分析:对于小数,这个限定符会限制所有数字的最小显示宽度 |
当用%f打印小数小数点后面默认打印六位,上面123.45小数点后面是45,不够六位补上四个0;在这里我们用%12f来打印,需要它小数整数部分包括后面的0输出一共要打12位,如果不满足12位,则在前面用空格补上。
2,显示正负号
默认情况下,printf ()不对整数显示+号,只对负数显示-号,这里只要在%后面加一个正号就可以显示正号了。
int main()
{
printf("%+d", 123);
return 0;
}
3,限定小数位数
输出小数时,有时希望限定小数的位数,举例来说,希望小数点后面只保留两位,占位符可以写%.2f,但是会四舍五入的。
int main()
{
printf("%.2f", 123.45562);
return 0;
}
分析: |
4,输出字符串
%s输出字符串默认是全部输出,如果只想输入开头的部分,可以用%.[m]s指定输出的长度,其中[m]代表一个数字,表示所要输出的长度。
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
分析:
在这里前面输出文本占位符为%.5s,表示输出五个字符,所以只打印hello。
所谓占位符,就是这个位置可以用其他值植入
案例一: 占位符:%d
int main()
{
printf("%d个和尚有水喝,%d个和尚没水喝\n",1,3);
return 0;
}
上面的案例中,双引号引起来的是输出文本,里面的%d就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为%,第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。所以printf的后面两个参数1,3就是替换占位符的值。
案例二:占位符:%s
int main()
{
printf("%s的成绩是100\n", "张三");
return 0;
}
在上面的案例中,%s表示代入的是一个字符串,所以printf()的第二个参数就必须是字符串,张三就是字符串替代前面的输出文本中的%s。执行后输出为“张三的成绩是100”。
案例三: 多个占位符
int main()
{
printf("%s的成绩是%d\n", "张三",100);
return 0;
}
在上面的案例中,输出文本中的占位符%s对应第二个参数张三,占位符%d对应第三个参数100,它们之间是一一对应关系,如果有n个占位符,printf()的参数就因该有n+1个。如果参数个数少于对应的占位符,printf()可能会输出内存中的任意值。
1,scanf ()用于读取用于的键盘输入,当程序运行到这个语句时,会停下来,等待用户从键盘输入。用户输入数据,按下回车键后,scanf就会处理用户的输入,将其存入变量里面。
2,scanf在使用时需要包含头文件,它的头文件是stdio.h
3, scanf和printf的语法类似
4, scanf第一个参数是一个格式字符串,里面放着占位符,告诉编译器如何解读用户的输入,需要提取的数据是什么类型。它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。
int main()
{
int score = 0;
printf("请输入学生成绩:");
//输入
scanf("%d",&score);
//输出
printf("学生成绩为:%d",score);
return 0;
}
分析: |
int main()
{
int x, y, j, k = 0;
scanf("%d%d%d%d",&x,&y,&j,&k);
printf("%d %d %d %d", x, y, j, k);
return 0;
}
分析: |
scanf()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。
int main()
{
//假设我们这里输入的值是 123.456#125
int x = 0;
float y = 0;
scanf("%d",&x);
printf("%d\n",x);
scanf("%f", &y);
printf("%f", y);
return 0;
}
分析: |
scanf()的返回值是一个整数,表示读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回零。如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
在这里用代码来演示一下:
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = scanf("%d%d%d", &a, &b, &c);
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
printf("%d",d);
return 0;
}
1,上面的占位符之中,除了%c以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。下面代码演示:
分析: |
在这里其他类型变量输入的时候可以直接跳过空白字符来到它要的相应类型的位置,而字符型变量输入的时候不会忽略空白字符,因为空白字符也是字符因此在输入的时候他不会忽略空白字符,而是把它也计算在内,就如上图,我们是想要打印字符a,但是前面有空白字符所以我们打印的也是空白字符。
2,如果想要强制跳过字符前的空白字符,可以写成scanf(" %c",&ch),即% c前加一个空格,表是跳过零个或多个空白字符。
下面要特别说一下占位符%s,它不能等同于字符串,它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格,换行符,制表符等)为止。因为%s不会包含空白字符,所以无法用来读取多个单词,除非多个%s一起使用,这也意味着,scanf()不适合读取包含空格的字符,另外scanf()遇到%s占位符,会在字符串变量末尾存储一个空白字符’\0’。
分析: |
在这里printf识别占位符只有遇到’\0’才停止,所以把后面的内存空间所占的字符也打印出来了
分析: |
在这里系统报错是因为原先数组内存的是abcde这五个字符,然而用%s输入的时候却会在字符串变量末尾加上一个空字符’\0’,表示字符串的结尾。导致数组超出了的范围,数组越界而出现错误。
所以scanf()在将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以在存储字符串的时候,很可能会超出数组的边界,导致预先不到的结果。为了防止这种情况出现,使用占位符%s时,因该指定字符串的最大长度,即写成%[m]s,其中[m]表示一个整数,表示读取字符串的最大长度,后面的字符也将被丢弃。
分析: |
上面示例中,我们之后scanf输入字符串会在后面加上一个\0,arr是一个长度为5的字符串,scanf占位符%4s表示最多读取用户输入的4个字符,后面的字符将被丢弃,这样就不会出现上面那样的报错了,不存在数组溢出的风险。
在这里就已经将所有有关于printf和scanf的知识学完啦,如果对你有所帮助请记得给小编点个赞鼓励一下