2、输入输出控制
1、输入函数
C语言中输入常用的三个函数:字符输入函数getchar()、字符串输入函数gets()、格式化输入函数scanf()
1.1、字符输入函数getchar
|
头文件 |
stdio.h |
|
函数功能 |
在键盘上读一个字符 |
|
函数原形 |
int getchar(void) |
|
函数参数 |
无 |
|
函数返回值 |
成功:返回读到的字符 |
|
失败或读到结束符:返回EOF(-1)。 |
getchar函数的特点:
getchar函数只能从键盘读到一个字符型的数据,即每次只能接收一个字符。
getchar有缓冲区和回显。
它的返回值为int,getchar返回值的含义是存储从键盘上读取的字符,然后返回读取到的字符的ASCII值,因为在计算机中字符是以ASCII值处理的,每个字符都有一个相对应的ASCII值。
/*函数用法*/ #include <stdio,h> int main() { char a; a=getchar(); printf(“%c\n”,a); return 0; }
1.2、字符串输入函数gets
|
头文件 |
stdio.h |
|
函数功能 |
从键盘上输入一串以回车作为结束符的字符串放入字符数组中,并自动加‘\0’。 |
|
函数原形 |
char *gets(char *s) |
|
函数参数 |
s为字符数组,存储输入的字符串 |
|
函数返回值 |
成功:返回字符数组的起始地址 |
|
失败或读到结束符:返回NULL |
gets函数特点:
回车键不会读入字符串中,字符串必须以‘\0’结束,结束时字符串会自动加‘\0’。
gets不以空格作为字符串输入结束的标志,而是以回车作为输入结束标志,即点击回车时字符串的输入就结束了,gets函数就执行完毕了,回车即‘\r’,ASCII值为13。
gets函数的参数中不含长度控制,当输入字符时,最多只能输入n-1个,必须留一位用来存储‘\0’,如果输入的个数超了,则多余的符号也被存储到字符数组中,这样就会造成内存的访问越界,结果是不可预料的。
/*用法*/ #include<stdio.h> int main() { char s[10]; gets(s); puts(s); return 0; }
1.3、格式化输入函数scanf
|
头文件 |
stdio.h |
|
函数功能 |
按指定格式从键盘读入数据,存入地址表示指定存储单元中,并按回车键结束。用户是将数据从键盘输入缓冲区,scanf是从缓冲区来提取数据的。 |
|
函数原形 |
int scanf(const char *format,…..) |
|
函数参数 |
format指定输入格式,后面跟要输入的变量的地址表,为不定参,用“….”代表。 |
|
函数返回值 |
成功:返回输入成功的变量的个数 |
|
失败:返回-1(EOF) |
在输入时,每按一次回车键,程序就会认为完成了一次输入操作,scanf就开始从缓冲区读取用户输入的内容,并根据格式控制字符串从中提取有效数据,只要用户输入的数据与格式控制字符串相匹配,就可以正确提取,若输入的内容格式与格式控制字符串不匹配,按回车键就会结束。
Scanf()函数对输入数据之间的空格的处理比较宽松,并不要求空格数严格对应。
用户和scanf( )函数是通过缓冲区来中转数据的,用户将数据从键盘输入缓冲区,scanf( )从缓冲区中取数据
本质上讲,用户输入的内容都是字符串,scanf()完成的是从字符串提取有效数据的过程。
Scanf(“%d %d”,&a,&b)---------à11 22 Scanf(“%d,%d”,&a,&b)---------à11,22 Scanf(“%d is bigger than %d”,&a,&b)---------à11 is bigger than 22
输入分隔符:在输入时,一般以空格、TAB或回车键作为分隔符。
(1)、在用“%c”格式符时,空格和转义字符作为有效字符输入。
(2)、输入数据时,遇到以下情况认为该数据结束:
------ 空格、TAB或回车;
------宽度结束;
------非法输入(输入的数据格式不对称);
(3)、scanf函数返回值是成功输入的变量的个数,当遇到非法输入时,返回值会小于实际变量的个数。
(4)、使用输入函数时可能会留下垃圾
当第一次输入时留下的垃圾就会被第二次取走,解决此问题的方法:
A、 调用getchar函数,清除垃圾字符
/*例子*/ scanf(”%c”,&ch); getchar(); //清理字符串 scanf(”%c”,&ch);
B、 用格式串中的空格或“%*c”来吃掉
/*举例*/ scanf(” %c”,&ch); 或scanf(“%*c%c”,&ch);
scanf函数支持的输入数据的格式:
|
数据类型 |
格式符 |
作用 |
|
字符形 |
c |
单一字符 |
|
s |
字符串 |
|
|
整形 |
i d |
十进制整数 |
|
hd |
十进制短整型 |
|
|
ld |
十进制长整形 |
|
|
X x |
十六进制无符号整数 |
|
|
o |
八进制无符号整数 |
|
|
u |
十进制无符号整数 |
|
|
浮点型 |
e |
指数形浮点小数 |
|
f |
小数形式浮点小数 |
scanff函数支持的格式说明符的修饰符:
|
修饰符 |
功能 |
|
h |
用于d,o,x前,指定输入为short型整数 |
|
l |
用于d,o,x前,指定输入为long型整数 |
|
用于e,f前,指定输入为double型整数 |
|
|
m |
指定输入数据宽度,遇空格或不可转换字符结束 |
|
* |
抑制符,指定输入项读入后不赋给变量 |
2、输出函数
2.1、字符输出函数putchar
|
头文件 |
stdio.h |
|
函数功能 |
在标准输出上显示一个字符 |
|
函数原型 |
int putchar(int c) |
|
函数参数 |
c为字符常量或表达式 |
|
函数返回值 |
输出的字符 |
putchar函数的参数和返回值都是整形,它是以字符对应的ASCII码值进行传参和返回的,然后根据ASCII码值以字符形式输出。
putchar函数输出的是字符型数据,而且每次只能输出一个,若要输出多个字符(即输出字符串)就需要加循环。
/*函数用法*/ #include <stdio.h> int main() { int a=65; char b=’B’; putchar(a); putchar(‘\n’)’ putchar(b); return 0; }
2.2、字符串输出函数puts
|
头文件 |
stdio.h |
|
函数功能 |
在标注输出上显示字符s |
|
函数原形 |
int puts(const char *s) |
|
函数参数 |
s为需要输出的字符串 |
|
函数返回值 |
成功:返回一个非0的数字 |
|
失败:返回-1或EOF |
puts在输出字符串时会自动追加换行符’\n’,即会自动换行
/*函数用法*/ #include <stdio.h> int main() { char s[]=”welcome”; puts(s); //输出字符串s return 0; }
2.3、格式化输出函数printf
|
头文件 |
stdio.h |
|
函数功能 |
格式化字符串输出 |
|
函数原形 |
int printf(const char *format , …) |
|
函数参数 |
format指定输出格式,后面跟要输出的变量,为不定参,用“….”代表。 |
|
函数返回值 |
成功:返回输出的字节数 |
|
失败:返回-1或EOF |
/*函数用法*/ #include <stdio.h> Int main() { char ch=’a’; char s[]=”hello word”; int a=123; float f=8512.462265; printf(“%3c\n:,ch); prinft(“%s,%15s,%10.5s\n”,s,s,s) prinft(“%8d,%8.2d\n”,a,a); printf(“%-f,%8f,%8.3f,%-+.2f\n”,f,f,f,f); return 0; }
printf函数支持的输出数据的格式:
|
数据类型 |
格式符 |
作用 |
|
字符形 |
c |
单一字符 |
|
s |
字符串 |
|
|
整形 |
i d |
十进制整数 |
|
hd |
十进制短整型 |
|
|
ld |
十进制长整形 |
|
|
X x |
十六进制无符号整数 |
|
|
o |
八进制无符号整数 |
|
|
u |
十进制无符号整数 |
|
|
浮点型 |
e E |
指数型浮点小数 |
|
f |
小数形式浮点小数 |
|
|
百分号 |
%% |
百分号本身 |
printf支持的格式说明符的修饰符:
|
修饰符 |
功能 |
|
m |
指定输出数据的长度(包括小数),不够就左补空格,超了就按原样输出 |
|
.n |
对实数,指定输出数据的小数位数 |
|
对字符串,指定实际输出位数 |
|
|
- |
是输出数据在域内左对齐(不用该修饰符时右对齐) |
|
+ |
指定在用符号数的正数前面加正号(+) |
|
0 |
输出数据时指定左面不使用的空位自动填0 |
|
# |
使用该符号时可以在八进制和十六进制前面显示0、0x |
|
l |
在d、o、x、u前,指定输出精度为long型 |
|
在e、f、g前,指定输出精度为double型 |
3、格式控制符和转义字符
|
转义字符 |
意义 |
ASCII码值(十进制) |
|
\a |
响铃(BEL) |
007 |
|
\b |
退格(BS) ,将当前位置移到前一列 |
008 |
|
\f |
换页(FF),将当前位置移到下页开头 |
012 |
|
\n |
换行(LF) ,将当前位置移到下一行开头 |
010 |
|
\r |
回车(CR) ,将当前位置移到本行开头 |
013 |
|
\t |
水平制表(HT) |
009 |
|
\v |
垂直制表(VT) |
011 |
|
\' |
单引号 |
039 |
|
\" |
双引号 |
034 |
|
\\ |
反斜杠 |
092 |
|
\ddd |
八进制:以0作为前缀开头,如0677 |
|
|
\xhh |
十六进制:以0x作为前缀开头,如0x9f |
|
|
格式控制符 |
说明 |
|
%c |
输出一个单一的字符 |
|
%hd、%d、%ld |
以十进制、有符号的形式输出 short、int、long 类型的整数 |
|
%hu、%u、%lu |
以十进制、无符号的形式输出 short、int、long 类型的整数 |
|
%ho、%o、%lo |
以八进制、不带前缀、无符号的形式输出 short、int、long 类型的整数 |
|
%#ho、%#o、%#lo |
以八进制、带前缀、无符号的形式输出 short、int、long 类型的整数 |
|
%hx、%x、%lx |
以十六进制、不带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字也小写;如果 X 大写,那么输出的十六进制数字也大写。 |
|
%#hx、%#x、%#lx |
以十六进制、带前缀、无符号的形式输出 short、int、long 类型的整数。如果 x 小写,那么输出的十六进制数字和前缀都小写;如果 X 大写,那么输出的十六进制数字和前缀都大写。 |
|
%f、%lf |
以十进制的形式输出 float、double 类型的小数 |
|
%e、%le |
以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。 |
|
%g、%lg |
以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写。 |
|
%s |
输出一个字符串 |
|
控制符 |
说明 |
|
%nd |
在%和字母之间插入一个数字来指定输出的最小宽度。如果数字本身的位数小于这个宽度,默认会在左侧用空格填充 |
|
%0nd |
在字段宽度数字前加一个0,表示用前导零0而不是空格来填充宽度 |
|
%.nd |
在%和字母之间使用 .<数字> 来指定最小数字位数(精度)。如果数字本身的位数小于这个精度,会在左侧用前导零0填充。 注意:精度修饰符对整数的效果与 %0Xd 非常相似,但逻辑不同。精度指定的是数字部分的最小位数。 |
|
%[width].[precision]type |
你可以同时使用宽度和精度。宽度是整个输出(包括填充符)的最小字符数,精度是数字部分的最小位数。 |
|
%[flags][width][.precision]type |
对于浮点数,type 通常是: f 或 F: 小数形式 e 或 E: 科学计数法形式 g 或 G: 根据数值自动选择 %f 或 %e(更紧凑的形式) |
|
%.nf |
在 % 和字母之间使用 .<数字> 来指定小数点后的位数 |
|
%m.nf |
在 % 和 . 之间插入一个数字来指定输出的最小总宽度(包括小数点、整数部分、小数部分和符号)。 |

浙公网安备 33010602011771号