键盘输入和屏幕输出

目录

单个字符的输入/输出

字符-常量

字符的输入/输出

数据的格式化屏幕输出

printf()的一般格式

printf()中的格式修饰符

数据的格式化键盘输入

scanf()的一般格式

 scanf()的格式修饰符

函数scanf()与缓冲区


单个字符的输入/输出

字符-常量

1.用单引号括起来的一个字符,如:'a','3',而 3 表示一个数字

2.C中用转义字符即反斜线(\)开头的字符序列来描述特定的控制字符

'\n'换行
'\r'回车(不换行),即将光标移到当前行的起始位置
'\0'空字符,代表一个字符,而不是两个字符,常用做字符串结束标志
'\t'相当于按下Tab键,水平制表
'\v垂直制表
'\b'退格
'\f'走纸换页
'\a'响铃报警提示音
'\"'一个双引号
'\''一个单引号
'\\'一个反斜线
'\?'问号
'\ddd'1-3位八进制ASCII码值所代表的字符
'xhh'1-2位十六进制ASCII码所代表的字符

注意: (1)每次按下Tab键,并不是从当前光标向后移1个Tab宽度(4个字符),而是移到下一个制表位,实际移动的宽度视当前光标位置距相邻的下一个制表位的距离而定

(2)当转义序列出现在字符串中时,是按单个字符计数的,如:"abc\n"的长度时4而非5,因为'\n'代表1个字符

字符的输入/输出

1.putchar():把一个字符输出到屏幕的当前光标位置

2.getchar():从键盘读字符

3.调用getchar()---用户按键---字符入缓冲区(直到按回车为止,回车也入

(1)每次调用只读1个字符返回值是ASCII码,若遇到文件结尾(End-Of-File),返回-1,且输出字符

(2)若输入多个字符,则其他字符留在缓冲区,等待后续getchar(),直到缓冲区中字符(包括回车)全部读完,才会等待用户按键,只要缓冲区有字符就不会等待用户的按键,按先后顺序输出,先入先出

思考:输入大写字母,输出小写字母(ASCII码差32)

#include<stdio.h>
int main()
{
	char ch;
	printf("请输入:");
	ch = getchar();
	ch = ch + 32;
	putchar(ch);     //printf("%d\n",ch)则会输出ch此时的ASCII码值
	putchar('\n');
	return 0;
}


输出结果:
请输入:A
a

数据的格式化屏幕输出

printf()的一般格式

1.printf(格式控制字符串);

printf(格式控制字符串,输出值参考表);

其中,格式控制字符串用双引号括起来,也称转换控制字符串

2.格式控制字符串:格式转换说明+需原样输出的普通字符

3.格式转换说明由%开始,并以转换字符结束,用于指定输出值参考的输出格式

 每个格式转换说明符和输出值参数表中的输出值一一对应,无输出值参数时,格式控制字符串中不再需要格式转换说明字符

 4.printf("\n");    \n放在双引号内,该语句可输出一个字符串

printf('\n');    \n放在单引号内,该语句只能输出一个字符

printf()中的格式修饰符

1.可在%和格式符中间插入其他格式修饰符

 注意:(1)%7.2f  ==》%m.nf

数据的格式化键盘输入

scanf()的一般格式

 scanf()的格式修饰符

1.

2.在用scanf()输入数值型数据时,以下情况会认为数据输入结束:

(1)遇到空格符,回车符,制表符;

(2)达到输入域宽;

(3) 遇到非法字符输入;

注意:若scanf()的格式控制字符中存在除格式说明符以外的其他字符,那么这些字符必须在输入数据时,由用户丛键盘原样输入

思考

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("a=%d,b=%d", a, b);
	return 0;
}

 (1)若对第五行进行更改,更改后应如何输入?

​
#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("a=%d,b=%d", a, b);
	return 0;
}

​
运行结果:
a=12,b=34↙
a=12,b=34

(2)输入限定以下格式,同时要求程序输出结果为a='12',b='34',如何更改?

输出格式: 

12↙

34↙

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("a=\"%d\",b=\"%d\"", a, b);//使用转义字符
	return 0;
}


运行结果:
12↙
34↙
a="12",b="34"

(3)若使用户可以用任意字符作为分隔符输入数据,如何改?

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

 忽略修饰符*使得对应的输入项在读入后不赋给任何变量,均会输出a=12,b=34

(4)若输入了非法字符,如:12 3a↙,如何?

输出结果为:

a=12,b=3

因为当程序从数据中读取第二个数据时遇到a,于是第二个被读取的数据是3

(5)输入123a↙如何?

123a↙
a=123,b=-858993460

输入非法字符,scanf()未能读入指定的数据项数

(6)如上,如何判断scanf()函数是否成功读入指定的数据项数呢?

检查返回值,当返回指定的数据项数时,则成功;当返回EOF值(在stdio.h中被定义为-1的常宏量)则失败

函数scanf()与缓冲区

 1.在使用%c格式读入字符时,空格字符和转义字符(包括回车)都会被当做有效字符读入

2.%c格式符存在问题的解决方法

(1)用getchar()将数据输入时存入缓冲区中的回车符读入,以避免被后面的字符型变量作为有效字符读入

(2)在%c前加一个空格,忽略前面数据输入时存入缓冲区中的回车符,避免被后面的字符型变量作为有效字符读入

#include<stdio.h>
int main()
{
	int a;
	char b;
	float c;
	printf("输入一个整型常量:");
	scanf("%d", &a);
	printf("整型常量:%d\n", a);
	printf("输入一个实型常量:");
	scanf("%c", &b);
    printf("实型常量:%c\n",b);
	printf("输入一个浮点数:");
	scanf("%f", &c);
	printf("浮点数:%f\n", c);
	return 0;
}

运行结果为:

输入一个整型常量:12↙
整型常量:12
输入一个实型常量:实型常量:
输入一个浮点数:3.5↙
浮点数:3.500000

为什么第二次没有输入而直接跳过?

因为上一步为12和回车,缓冲区里还剩回车符,scanf()直接读取回车符,不再进行键盘输入

解决方法

(1)

#include<stdio.h>
int main()
{
	int a;
	char b;
	float c;
	printf("输入一个整型常量:");
	scanf("%d", &a);
	printf("整型常量:%d\n", a);
	getchar();//将存于缓冲区的回车符读入,避免在后面作为有效字符读入
	printf("输入一个实型常量:");
	scanf("%c", &b);
	printf("实型常量:%c\n",b);
	printf("输入一个浮点数:");
	scanf("%f", &c);
	printf("浮点数:%f\n", c);
	return 0;
}

(2)

#include<stdio.h>
int main()
{
	int a;
	char b;
	float c;
	printf("输入一个整型常量:");
	scanf("%d", &a);
	printf("整型常量:%d\n", a);
	printf("输入一个实型常量:");
	scanf(" %c", &b);//在%c前面加空白符(如空格),读取时跳过缓冲区中的空白符,
	                 //找到非空白符的数据进行读取,空白符取出,读取顺序按照输入顺序(包括回车符)
	printf("实型常量:%c\n",b);
	printf("输入一个浮点数:");
	scanf("%f", &c);
	printf("浮点数:%f\n", c);
	return 0;
}

注意:scanf("%d\n",&a);是错误的,因为scanf()中不能使用转义字符

scanf("%8.2f",&c);是错误的,因为scanf()无法控制精度

思考:均输入123456↙

#include<stdio.h>
int main()
{
	int a, b;
	scanf("%2d%*2s%2d", &a, &b);
	printf("%d,%d\n", a, b);
	scanf("%3d%*2s%3d", &a, &b);
	printf("%d,%d\n", a, b);
	scanf("%3d%*3s%3d", &a, &b);
	printf("%d,%d\n", a, b);
	return 0;
}

运行结果:
123456↙
12,56
123456↙
123,6
123456↙
1↙    //读取数据数目不够,需要再次从键盘读入
123,1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值