目录
单个字符的输入/输出
字符-常量
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