C语言——输入输出函数_学习笔记

printf()函数1

函数作用和参数组成

printf() 是 C 语言标准库函数,用于将格式化后的字符串输出到标准输出。
(输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。)
来源:https://legacy.cplusplus.com/reference/cstdio/printf/?kw=printf
格式化字符串包含三种对象,分别为:

字符串常量;

字符串常量原样输出,在显示中起提示作用。

占位符

占位符是以 % 开头的字符串,在 % 后面跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。

转义字符

转义字符在字符串中会被自动转换为相应操作命令。

知识点

  1. printf()允许限定占位符的最小宽度。%5d表示这个占位符的宽度至少为5位。如果不满5位,对应的值的前面会添加空格。如果超过5位,正常输出就行,5是最少输出5位。
    例如:
#include <stdio.h>

int main()
{
    printf("%5d\n", 123456);
    return 0;
}

输出结果为

123456
  1. 可以自定义输出样式
- 减号结果左对齐,右边填空格。默认是右对齐,左边填空格。
+ 加号输出符号(正号或负号)
space 空格输出值为正时加上空格,为负时加上负号
# 井号type是o、x、X时,增加前缀0、0x、0X。

例如:

printf("%5d\n",1000);     //默认右对齐,左边补空格
printf("%-5d\n",1000);     //左对齐,右边补空格

printf("%+d %+d\n",1000,-1000);  //输出正负号

printf("% d % d\n",1000,-1000);  //正号用空格替代,负号输出

printf("%x %#x\n",1000,1000);  //输出0x

printf("%.0f %#.0f\n",1000.0,1000.0)//当小数点后不输出值时依然输出小数点

printf("%g %#g\n",1000.0,1000.0); //保留小数点后后的0

printf("%05d\n",1000);    //前面补0

输出结果:

 1000
1000
+1000 -1000
 1000 -1000
3e8 0x3e8
1000 1000.
1000 1000.00
01000

scanf()函数1

函数作用和参数组成

scanf() 是 C 语言标准库函数,用于读取键盘输入的数据。

在这里插入图片描述
此函数的参数组成和printf()函数的参数组成很类似,就不再赘述。
例如:

#include<stdio.h>
int main(void) 
{ 
    int a,b,c; 
 
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c); 
    printf("%d,%d,%d\n",a,b,c);
    return 0; 
}

键盘输入:

1 2 3

输出结果:

1,2,3

知识点

  1. 关于占位符
    占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格。
#include<stdio.h>
int main(void)
{
    char a;
    scanf("%c", &a);
    printf("%cXXXX", a);
    return 0;
}

输入a 后,运行结果如下:
在这里插入图片描述

输入 空格+a 后,运行结果如下:
在这里插入图片描述

如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch),即 %c 前加上⼀个空格,表示跳过零个或多个空⽩字符。

#include<stdio.h>
int main(void)
{
    char a;
    scanf(" %c", &a);
    printf("%cXXXX", a);
    return 0;
}

输入 空格+a 后,运行结果如下:
在这里插入图片描述

特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为止。

  1. 数据溢出安全问题
    scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组长度。所以,储存字符串时,很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使用 %s 占位符时,应该指定读⼊字符串的最长长度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表示读取字符串的最大长度,后⾯的字符将被丢弃。
#include <stdio.h>
int main()
{
    char name[11];
    scanf("%10s", name);
    printf("%s\n", name);
    return 0;
}

上⾯示例中, name 是⼀个⻓度为11的字符数组, scanf() 的占位符 %10s 表示最多读取用户输⼊的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的⻛险了。
在这里插入图片描述
如果不写成写%[m]s ,如下图

#include <stdio.h>
int main()
{
    char name[11];
    scanf("%s", name);
    printf("%s\n", name);
    return 0;
}

则如果输入的字符超过了数组的容量,输入 abcdefghijklmn 输出情况如下:
在这里插入图片描述
造成数据溢出,报错。

  1. 赋值忽略符
    有时,用户的输⼊可能不符合预定的格式。如下:
#include <stdio.h>
int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d-%d-%d", &year, &month, &day);
	return 0;
}

上⾯示例中,如果用户输⼊ 2020-01-01 ,就会正确解读出年月日。但是如果用户输入的是其他格式,比如2020/01/01 ,这种情况下scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
例如:

#include <stdio.h>
int main()
{
	int year = 0;
	int month = 0;
	int day = 0;
	scanf("%d%*c%d%*c%d", &year, &month, &day);
	return 0;
}

上⾯示例中, %*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表示这个占位符没有对应的变量,解读后不必返回。

  1. 读取多行输入
#include <stdio.h>
int main()
{
	int n;
	while(scanf("%d",&n) != EOF)
	{ 
	
	}
	return 0;
}

当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
在这"scanf(“%d”,&n) != EOF"相当于"scanf(“%d”,&n) != EOF",或"~scanf(“%d”,&n)“,或"scanf(”%d",&n) == 1 " 。scanf的返回值由后面的参数决定。
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while。2
一般就VS来说,可能需要按3次 ctrl+z .
————————————————


  1. 使用时要包含头文件,即 #include <stdio.h> ↩︎ ↩︎

  2. 参考数据来源:https://blog.csdn.net/henu1710252658/article/details/83040281 ↩︎

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值