在C语言中,输入输出函数有着相当重要的地位,它是我们的程序与用户交互的唯一途径,现在我就将C语言中比较常见的几个输入输出函数介绍给大家,以下这些讲解都是针对VC调试平台。
一、格式化输入输出函数
1.1 scanf()格式化输入函数
格式输入函数scanf( )函数,它的格式为scanf(“格式字符串”,输入列表)。“格式字符串”包含三种类型的字符:a、格式字符,以%开头的字符,用以说明输入列表的数据以何种类型及格式的形式输入。b、普通字符,要求在输入时必须原样一起输入的字符。C、空白字符(空格、跳格键、回车键)作为相邻两个数据的默认分隔符。
在scanf( )函数中有以下地方需要注意:
-
在scanf()函数中的格式字符串不存在转义字符,所以:格式字符串中的字符除了格式字符外全部都要原样输入。 如: int a; scanf(“%d/n”,&a); 如果我们想把10赋值给a,就需要在键盘上输入的是:10/n回车,才能把10赋值给a,这里/n已经不是转义字符,而是普通字符。 -
输入列表的变量如果是基本类型(即整型、实型、字符型)一定要使用取地址符&(输入字符串到字符数组的情况除外),而且&后必须是变量,不允许是常量或表达式。 如: int a,b; scanf("%d%d",a,b); 这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。 -
输入数据时,企图规定精度 float a; scanf("%.2f",&a); 这样做是不合法的,输入数据时不能规定精度,这里要记住一个程序是不能控制操作它的人来输入数据的精度的。 -
输入数据的方式与要求不符
- scanf("%d%d",&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:3,4 输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
- scanf("%d,%d",&a,&b);
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:3,4 此时不用逗号而用空格或其它字符是不对的。3 4 又如:scanf(“a=%d,b=%d”,&a,&b);输入应如以下形式:a=3,b=4 -
输入字符的格式与要求不一致 在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。 scanf("%c%c%c",&c1,&c2,&c3); 如输入a b c 字符“a”送给c1,字符“ ”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。 -
使用格式字符”%c”录入单个字符时,空格和回车键等字符都会作为有效字符输入,所以需要注意fflush(stdin)的使用。 -
注意输入列表中的元素的个数要与格式字符串中的格式字符个数相同。 -
在输入长整形数据和双精度浮点数时,必须使用长度修饰符”l”。(long long型加上“ll”) -
不要在不该使用取地址符的地方使用取地址符。 如:char str[10]; scanf(%c,&str);这里不应该加取地址符&。
1.2 printf()格式输出函数
格式输出函数printf( ),它的格式为printf(“格式字符串”,输出列表)。这里的格式字符串也包含三种类型的字符,但这里和scanf( )函数的字符稍有不同。这三种类型的字符分别是:a、格式字符,以%开头的字符,用以说明输出列表的数据以何种格式的形式输出。B、转义字符,提供特殊的格式化控制,由一个“/”和一个字符组成。反斜杠会使printf( )函数以特殊的方式解释一个字符。C、普通字符,除格式字符和转义字符外的其他字符。
格式字符:
-
d格式:用来输出十进制整数。有以下几种用法:
-
o格式:以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。同样也可以指定字段宽度用“%mo”格式输出。 例: printf("%d, %o", -1, -1); 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8。 -
x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。同样也可以指定字段宽度用"%mx"格式输出。 -
u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。同样也可以指定字段宽度用“%mu”格式输出。 -
c格式:输出一个字符。 -
s格式:用来输出一个串。有几种用法
- %s:例如:printf("%s", “CHINA”)输出"CHINA"字符串(不包括双引号)
- %ms:输出的字符串占m列,如果字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
- %-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
- %m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
- %-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
-
f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
- %f:不指定宽度,整数部分全部输出并输出6位小数。
- %m.nf:输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。
- %-m.nf:输出共占m列,其中有n位小数,若数值宽度小于m右端补空格。
-
e格式:以指数形式输出实数。可用以下形式:
- %e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
- %m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
-
g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。
在printf( )函数中有以下地方需要注意:
-
输出列表由若干个输出项组成,输出项可以是常量、变量,也可以是表达式。 -
格式字符串中的格式字符要与后边输出列表中的元素类型一一对应。 如: float a=1.9999; printf("%d",a);最终的输出结果是一些乱码。 再如: int a=12; printf("%f",a);最终的输出结果是0.000000,这里没有进行类型转换。 但是,如果想把上面的整数a以浮点数的形式输出,必须进行强制类型转换。如: int a=12; printf("%f",(float)a);输出的结果是12.000000。 -
格式字符串中的格式字符的个数要与输出列表中的元素个数相同。 如: int a=12; printf("%d, %d",a);将在屏幕上输出一个12以及一个乱码。 -
在以%.nf这样的格式进行输出浮点数时,有四舍五入。 如: float a=1.9999; printf(“%.2f”,a);最终的输出结果是2.00。 -
长度修饰符“l”在输出长整形数据时可不要,因为在VC中,long和int占用的字节长度都是4,所有可以不加上“l”。(双精度浮点型要加上,另外long long型是加上“ll”) -
格式符%±nd中,n表示一个十进制整数输出时在屏幕上占n个字符的宽度,如果n前面是+号,则表示输出的整数右对齐,那么输出的整数左边补空格;如果n前面是-号,则表示输出的整数左对齐,输出的整数右边补空格。 -
在-128~127之间的整数可以以字符的格式输出,字符也可以以整型的格式输出。 如: int a=97; printf("%c",a);输出的结果是’a’,因为‘a’存储在内存中是以ASCII码的形式存储的。 再如: char a=‘a’; printf("%d",a);输出的结果是97,原因同上。 -
如果想输出字符"%",则应该在“格式控制”字符串中用连续两个%表示,如: printf("%f%%", 1.0/3); 输出0.333333%。
二、单字符输入、输出函数
C语言提供了两个无格式控制的,专门用于输入、输出单个字符的函数getchar( )和putchar( )。
2.1 单字符输入函数getchar()
-
getchar( )函数没有参数,有返回值,返回的就是输入的那个字符。 -
getchar( )函数一次只能接收一个字符。 -
getchar( )函数同样将空格和回车键等字符都会作为有效字符输入,所以注意和fflush(stdin)函数的结合使用。
2.2 单字符输出函数putchar()
-
putchar()函数有参数,无返回值。参数就是它要输出的那个字符,可以是字符变量或着字符常量 -
putchar()函数一次向显示器输出一个字符。
三、字符串输入、输出函数
C语言还提供了两个无格式控制的专门对字符串处理的函数,gets( )和puts( )。
3.1 gets()/gets_s()
用来接收用户输入的字符串,这是个有参数的函数,参数是一个字符数组类型,输入的字符串通过传址的方式传到这个字符数组中。
注意:在C++11中,采用 gets_s,原型:char *gets_s(char *buffer,size_t sizeInCharacters);
如: char buffer[21]; //20 chars + ‘\0’ gets_s(buffer,20); //写成21后,当输入21个字符回车之后,自动添加的’\0’,会要求分配存储空间的 printf(“Your input was %s\n”,buffer);
3.2 puts()
用来向用户显示一个字符串,它需要一个字符串参数,显示该参数并自动换行。如:
puts(“hello, world.”);与printf(“hello,world./n”);的效果相同,如果是puts(“hello.world./n”)则要输出两个换行。也就是说,puts( )中的字符串可以包含转义字符。
四、输入总结
4.1输入字符
-
getch(); ——从控制台读取一个字符,但是不回显在屏幕上;不需要回车结束。 -
getche(); ——从控制台读取一个字符,回显屏幕;不需要回车结束。 -
getchar(); ——从控制台读取一个字符,回显屏幕;需要回车结束(如果连续使用该函数,要注意下次调用该函数,会读取上次输入的回车符)。 -
scanf("%c",char *); ——从控制台读取一个字符,回显屏幕;需要回车结束(注意事项同上)。
4.2 输入字符串
-
scanf("%s",in_buff); ——可以格式化输入;第二个参数是地址,可以是字符指针或者字符数组;不提供字符数组数据越界检查;以回车结束输入。 -
gets(in_buff);/gets_s(in_buff, size) ——参数为地址,可以使字符指针或者字符数组;不提供字符数组越界检查;以回车结束输入。读入一行。 -
fgets(in_buff,BUFFER_SIZE + 1,stdin); ——参数1为字符指着或者字符数组,参数2为要输入的字符个数,+1表示字符串结束标志,参数3为标准是输入;提供越界检查,以buffer_size+1为标准;以回车结束输入。
这就是C语言中常用到的几个输入输出函数,而且这几个函数都包含在stdio.h头文件中。在这几个函数中,格式输入输出的用途最多也最容易出问题,希望提起大家的注意。 |