C语言复习-输入输出

printf 对齐例如:%-9d 左对齐 至少9个字符宽度 %9d右对齐至少9个字符宽度
在这里插入图片描述

scanf

int a, b, c;
scanf("%d %d", &a, &b);//以空格分界即可 例如:100 200
scanf("%d   %d", &a, &b);//同上
scanf("%d, %d, %d", &a, &b, &c);//必须以,分开 例如:100,200,300
scanf("%d is bigger than %d", &a, &b);//必须完全对应 例如:10 is bigger than 20
    int a = 1, b = 2, c = 3, d = 4;  //修改处:给变量赋予不同的初始值
    scanf("%d", &a);
    scanf("%d", &b);
    printf("a=%d, b=%d\n", a, b);
    scanf("%d %d", &c, &d);
    printf("c=%d, d=%d\n", c, d);
    一次性出入 12 60 a10↙
    结果为:a=12, b=60
			c=3, d=4
			在c处匹配失败,不会等待用户输入也不会报错。
    int a = 1, b = 2;
    scanf("a=%d", &a);
    scanf("b=%d", &b);
    printf("a=%d, b=%d\n", a, b);
   输入: a=99↙
	结果	:a=99, b=2
	输入a=99回车,前面匹配\n和b不匹配
	输入:a=99 b=100(把("b=%d", &b)改为(" b=%d", &b)则匹配)
	结果	:a=99, b=2 空格和b不匹配
	输入:a=99b=100 匹配

scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串(特殊情况可以读取)
只有当控制字符串以格式控制符开头时,才会忽略换行符

读取一个字符
在这里插入图片描述
gets() 是专用的字符串输入函数,与 scanf() 相比,gets() 的主要优势是可以读取含有空格的字符串
scanf()、gets() 在读取字符串时会忽略换行符,不会把换行符作为字符串的内容。

缓冲区:计算机在内存中预留的一部分存储空间,用来暂时保存输入输出的数据。
目的:让低速的出入输出设备和高速的用户程序能协调工作,降低输入输出设备的读取次数
全缓冲:缓冲区填满后再进行输出输入
行缓冲:遇到换行符进行输出输入(scanf自带行缓冲 按下回车产生换行符,刷新缓冲区,Windows下printf不带有缓冲区)printf在windows没有缓冲,在linux是行缓冲

缓冲区刷新:

  • 满了
  • \n
  • 关闭程序 关闭文件
  • 手动刷新

当遇到 scanf() 函数时,程序会先检查输入缓冲区中是否有数据:

  • 如果没有,就等待用户输入。用户从键盘输入的每个字符都会暂时保存到缓冲区,直到按下回车键,产生换行符\n,输入结束,scanf() 再从缓冲区中读取数据,赋值给变量。
  • 如果有数据,那就看是否符合控制字符串的规则:
    如果能够匹配整个控制字符串,那最好了,直接从缓冲区中读取就可以了,就不用等待用户输入了。
    如果缓冲区中剩余的所有数据只能匹配前半部分控制字符串,那就等待用户输入剩下的数据。
    如果不符合,scanf() 还会尝试忽略一些空白符,例如空格、制表符、换行符等:
    如果这种尝试成功(可以忽略一些空白符),那么再重复以上的匹配过程。
    如果这种尝试失败(不能忽略空白符),那么只有一种结果,就是读取失败。
	int a, b = 999;
	char str[30];
	scanf("%d", &a);
	scanf("%d", &b);
	scanf("%s", str);
	printf("a=%d, b=%d, str=%s\n", a, b, str);;
	system("pause");
	return 0;
	输入:100 www.sohu.com
	输出:a=100,b=999,www.sohu.con
	分析:第二个scanf匹配失败,不会报错,缓冲区中剩下的内容匹配第三个scanf

清空输出缓存区(刷新)
让缓冲区内容输出到显示器 fflush(stdout),清空缓冲区中内容

清空输入缓存区:清空缓冲区中内容

  1. 使用 getchar() 清空缓冲区
char c
while((c=getchar())!='\n'&&c!=EOF);

2)使用scanf清除缓冲区

scanf("%*[^\n]");
scanf("%*c");//用于删除\n

用户输入的字符串过长就存放不了了,就会冲刷掉其它的数据,从而导致程序出错甚至崩溃(为什么gets不安全)

scanf的高级用法
1)指定读取长度 例如:%2d最多读取两位整数 %10s最多读取10个字符
%5f最多读取5个数(点算一个数)
2)匹配特定的字符
例如:%[abcd]
表示只读取字符abcd,遇到其它的字符就读取结束;注意,这里并不强调字符的顺序,只要字符在 abcd 范围内都可以匹配成功,所以你可以输入 abcd、dcba、ccdc、bdcca 等。
3)连接符-来表示范围的字符
%[a-z]表示读取 abc…xyz 范围内的字符,也即小写字母;
%[A-Z]表示读取 ABC…XYZ 范围内的字符,也即大写字母;
%[0-9]表示读取 012…789 范围内的字符,也即十进制数字。
4)不匹配特定字符
方法就是在不匹配的字符前面加上^

%[^\n]表示匹配除换行符以外的所有字符,遇到换行符就停止读取;
%[^0-9]表示匹配除十进制数字以外的所有字符,遇到十进制数字就停止读取。

5)丢弃读取到的字符
方法就是在 % 后面加一个*

%*d表示读取一个整数并丢弃;
%*[a-z]表示读取小写字母并丢弃;
%*[^\n]表示将换行符以外的字符全部丢弃。

用scanf实现gets功能

scanf("%[^\n]");
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值