C函数功能说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C函数功能说明
printf函数
其功能是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据。
(1) printf函数的一般形式为:
printf (格式控制字符串,变量1,变量2,…);
格式控制字符串与scanf中的相同。printf函数的第二个及以后的各个参数(若有的话)是变量的名字,而不是变量的地址,因此与scanf的相应参数有所不同。数组名可直接出现在printf的变量位置上,作为printf的参量,是合法的。
与scanf函数一样,printf中的格式说明也是针对不同类型的数据用不同的格式说明。
(2) printf函数中的格式说明:
① d格式说明。用来输出十进制整数,有下列几种用法:
? %d,按整数型数据的实际长度输出,如
printf("%d",123456);
输出:123456
? %md,m 为指定的输出字段的宽度,如果实际数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。例:
printf("%4d,%4d,%4d",a,b,c);
若a = 123,b = 12345,c = 578,则输出为:
?123,12345,?578
? %ld, 输出长整型数据。如:
long a = 135970;
printf("%ld",a);
输出:135970。如果用%d输出,就会发生错误,对long型数据,应当用%ld格式输出。对长整型数据也可以指定字段宽度,如将上面的printf函数中的"%ld"改为"%8ld",则输出为:
??135970
8列
一个int型数据既可以用%d也可用%ld格式输出。如:
int a = 123;
printf("%ld",123);
输出:123
②o格式符,以八进制数形式输出整数,由于是将内存单元中各位的值(0或1)按八进制的形式输出,因此输出的数据不带符号,即将符号位也作为八进制数的一部分一起输出。例如,-1在内存中的存放形式(以补码存放)为:1 1 11 11 11 11 1111 11,所以有:
int a =-1;
printf("%d,%o",a,a);
这段小程序的输出为:-1,177777。
可见,%o格式说明的输出是将内存中的0、1串按从右到左3位一组的八进制数输出的,不带负号。对于长八进制数可用“%lo”的格式输出。同样也可以指定输出的宽度,如:
printf("%9o",a)的输出数据为:???177777。
③x格式符,以十六进制数形式输出整数,与o格式类似,也可不输出负号。因此有:
int a =-1;
printf("%d,%o,%x",a,a,a);
的输出结果为: -1,177777,ffff
可见,%x格式说明的输出是将内存中的0、1串按从右到左4位一组的十六进制数输出的。也可以用“%lx”输出长整数,及用“%mx”,如“%12x”输出指定字段宽的整数。
④u格式符,用来输出无符号型(unsigned型)数据,以十进制
形式输出。
一个无符号型(unsigned型)数据也可以用“%d”格式输出,一个有符号型(int型)数据也可以用“%u”格式输出。具体的输出值按相互赋值的规则处理。无符号型(unsigned型)数据也可以用“%o”或“%x”格式输出。
例2.10
main()
{unsigned int a = 65535;
int b =-2;
printf("a = %d,%o,%x,%u\n",a,a,a,a);
printf("b = %d,%o,%x,%u\n",b,b,b,b);
}
运行结果为:
a =-1,177777,ffff,65535
b =-2,177776,fffe,65534
注意:上例中65535在内存中的表示(16位)为:11 11 11 11 11 11 11 11;
⑤ c格式说明。
? %c格式,用来输出一个字符。例:
char ch ='a';
printf("%c",ch);
输出字符'a'。
一个整数,只要它的值在0~255之间,就可以用字符形式输出。在输出前,将该整数转换成相应的ASCII码字符。反之,一个字符数据也可以用整数形式输出。
例2.11
main()
{ char c1 = 'a';
int i = 97;
printf("%c,%d\n",c1,c1);
printf("%c,%d\n",i,i);
}
输出结果为:
a,97
a,97
? %mc格式用于指定输出字符宽度,如果有:
printf("%3c",c1);则输出:??a,即c变量输出占3列,前两列补空格。
⑥s格式说明。s格式用来输出一个字符串。有以下几种用法:
? %s,例如:
printf("%s","CHINA");输出:CHINA。
? %ms,输出的字符串占m列,如果字符串本身长度大于m,则突破m限制,将字符串全部输出。若串小于m,则左边补空格。例如:
printf("%7s","CHINA");输出:??CHINA
printf("%3s","CHINA");则突破输出宽度输出:CHINA
? %-ms,如果小于m列,则在m列范围内,字符串向左靠,右边补空格。例:
printf("%-7s","CHINA");输出:CHINA??
printf("%-3s","CHINA");突破输出宽度输出:CHINA??
? %m.ns,输出占m列,但只取字符串中左边n个字符输出。这n个字符输出在m列的右侧,左补空格。例:
printf("%7.3s","CHINA");输出:????CHI。
? %-m.ns,其中m和n所表示的意义同④,但n个字符输出在m列范围内的左侧,右补空格。如果n>m,则m自动取n的值,以保证n个字符自动正常输出。例:
printf("%-2.3s","CHINA");输出:CHI
⑦f格式说明。f格式用来输出带小数点的单、双精度实数。有下列几种用法:
? %f不指定字段宽度,由系统自动输出相应常量或变量的全部整数部分及6位小数。应注意,单精度实数输出时,有效数字位数一般为7位。而双精度实数输出时,有效数字位数一般为十六位,有6位小
数位。
例2.12
main()
{float x,y;
double u,v;
x = 111111.111;y = 222222.222;
u = 1111111111111.111111111;
v = 2222222222222.222222222;
printf("%f\n",x+y);
printf("%f\n",u+v);
}
运行结果为:
333333.328125
3333333333333.333010
可以看出,输出结果中前一个只有前7位数字是有效数字,而后一个则前16位数字是有效数字。其他位均无意义。
? %m.nf 指定输出的数值共占m位,其中有n位小数。若数值长度小于m,则左端补空格。若数值长度大于m,则按实际数值输出,小数位保留n位。
例:printf("%7.3f",23.456);
输出:’23.456
printf("%7.3",1123.456);
输出:1123.456
? %-m.nf与%m.nf基本相同,只是使输出数值向左端靠,右端补空格。例:
printf("%-10.3f",1111.1111);
输出:1111.111??
⑧e格式符。以指数形式输出实数。可用以下形式:
? %e不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6位小数,指定部分占5列(如e+003),其中:“e”占一位,指数的符号占一位,指数占三位。数值按标准化指数形式输出(即小数点前必须有且仅有一位非零数字)。例如:
printf("%e",1234.56);
输出: 1.234560e+003。也就是说,用%e格式输出的实数共占13列字符宽度。
8列 5列
? %m.ne和%-m.ne,其中n指尾数部分的小数位数。m为整个数值输出所至少占有的宽度。当未指定n时,自动使n = 6,整个数据占13列输出,可能会突破m的限制,而按实际长度输出。
例:printf("% 12.4e",1234.56);
输出:1.2346e+003(四舍五入)
⑨g格式说明。用来输出实数,它根据实数大小,自动选f格式或e格式(选择占宽度较小的一种输出),且不输出无意义的零。例如,若a = 123.456,则
printf("%f%e % g",a,a,a);
输出如下:
123.456000 1.234560e+002 123.456
用%f格式输出占10列。用%e格式输出占13列,用%g格式时,自动从上面两种格式中选择较短者(今为%f格式为短),故占10列,且按%f格式用小数点形式输出,最后三个小数位“0”为无意义的0,不输出。%g格式用的较少。
scanf函数
(1) scanf函数的一般形式:
scanf(格式控制字符串,地址1,地址2,…);
格式控制字符串是由双撇号括起来的字符串,它主要由两种类型的字符组成:
① 格式说明符由“%”和格式字符组成,如%c,%d,%s,%f等。其作用是将输入的数据转换为指定的格式,赋给scanf的二个参量(是地址1)所指定的内存单元(可能一次使用多个)中。格式说明以“%”字符为标志。
② 普通字符,是需要用户在输入时原
样输入的字符。例如:
scanf("%d%d",&a,&b);
scanf("%f,%f",&x,&y);
都是合法的格式输入语句。但在键入数据时略有区别,请看下例:
main()
{ int a, b, c, d;
scanf("%d %d",&a,&b);
scanf("%d,%d",&c,&d);
printf("%d,%d,%d,%d\n",a,b,c,d);
printf("%d %d %d %d",a,b,c,d);
}
运行时,按以下方式输入a,b,c,d的值:
3 4↙ 5,6↙
输出: 3,4,5,6
3 4 5 6
&a,&b,&c,&d中的&是取地址运算符,&a指a的地址。但要注意,上面的两个输入格式在输入时有所不同。“%d %d”表示按十进制整数形式输入两个数据。输入数据时,两个数据之间以一个或多个空格间隔,也可以用回车键,跳格键tab。下面的输入均合法:
? 3 4
? 3 ↙
4
? 3(按tab健)
4↙
但两个数据间不能用逗号等其他的字符。
而“%d,%d”亦表示按十进制输入两个数据。要求在输入数据时,两个数据间一定以一个逗号“,”作为间隔符,因此,上例中c和d的值的输入应按下列形式输入:
5,6
(2) scanf中可用的格式说明:
对应不同类型数据的输入,scanf的格式控制字符串中可以使用不同的格式字符构成不同的格式说明。常用的格式说明如下:
格式字符串 功能
%d 用来输入十进制整数,相应参数应为整数指针。
%o 用来输入八进制整数(前导零可有可无),相应参数应为整数指针。
%x 用来输入十六进制整数(前导零可有可无)。
%c 用来输入单个字符。
%s 用来输入字符串,将字符串送入一个字符数组中,在输入时以非
空白字符开始,以第一个空白字符结束。字符串以串结束标志'\0'
为其最后一个字符。
%f 用来输入一个浮点实数,可以用小数形式或指数形式输入。
%e 与%f的作用相同,e与f可以替换使用。
scanf附加的格式说明字符:
字符 说明
l 用于输入长整型数据,(可用%ld,%lo,%lx)以及双精度型数
据(如%lf或%le)。
h 用于输入短整型数据(可用%hd,%ho,%hx)。
域宽(为整数) 指定输入数据所占宽度(列数)。
* 表示本输入项在读入后不赋给任何相应的变量。
① 当指定输入数据所占列数后,系统将自动按
它截取所需数据。如:
scanf("%3d %3d %3d",&a,&b,&c);
输入123456789↙,系统将自动地把123赋给a,456赋给b,789赋给c。
scanf("%3c",ch);
则可输入3个字符,但ch必须是字符数组或字符指针。
② %后的“*”附加说明符,用来跳过它相应的数据。例如:
scanf("%2d %*3d %2d",&a,&b);
如果输入如下信息:
12 345 67↙
将12赋给a,67赋给b,第二个数据“345”被跳过,不赋给任何变量。在利用现存的数据时,有时不需要其中某些数据,可用此法“跳过”它们。
③ 输入数据时,精度可以规定,如:
scanf("%.2f",&a);
当输入1234.567时,a的值将为1234.57,自动取输入数据的小数点后两位数字。
(3) 使用scanf函数时应注意的问题:
① scanf函数中的第二个及以后各个参量是变量地址,而不是变量名。例如,设a 、 b 分别为整型变量和浮点型变量,则
scanf("%d %f",&a,&b);
是合法的。而
scanf("%d %f",a,b);
是非法的。
只有在字符数组的情况下例外,因为字符数组名实际是数组的第一个字符的地址。例如,若name[20]为一个字符数组,则
scanf("% s",name);
合法。而
scanf("% s",&name);
为非法。name为数组时,不需在其前面加“&”。
② 在用“%c”格式输入字符时,空格字符和“转义字符”都将作为有效的字符输入。例如:
scanf("%c%c%c",&c1,&c2,&c3);
如果输入a?b?c↙,则字符'a'送给c1,字符'?'送给c2,字符'b'送给c3。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此'?'作为下一个字符送给c2。同时应注意,上述语句中的格式控制字符串"%c%c%c"中,格式说明符之间无逗号分割。如果有空格,用形式为"%c %c %c"的格式控制字符串作替换,按上述输入格式,那么a、b、c这三个字符将分别赋给变量c1、c2、c3。
③ 在输入数据时,遇到下列情况时,输入数据认为结束:
? 遇空格或按“回车”或“跳格”(TAB)键;
? 遇宽度结束,如“%3d”,只取3列;
? 遇非法输入,如
scanf("%d%c%f",&a,&b,&c);
若输入
123a123o.26↙
ˉ ˉ ˉ
a b c
第一个数据对应%d格式输入123之后遇字母a,因此认为数值123后已没有数字了,第一个数据到此结束,把123送给变量a,字符'a'送给变量b,由于%c只要求输入一个字符,因此,'a'后面不需要空格,后面的数值应送给变量c。如果由于疏忽而把本来应为1230.26错打成123o.26,由于123后面出现了英文字母“o”,就认为此数据结束,则将会把123送给c,后面
的数据将不被接受。
④当使用多个scanf()函数连续给多个字符变量赋值时,例如:
main()
{
char c1,c2;
scanf(“%c”,&c1);
scanf(“%c”,&c2);
printf(“c1 is %c,c2 is %c”,c1,c2);
}
运行该程序,输入一个字符A后回车(要完成scanf()函数输入必须回车),在执行
scanf(“%c”,&c1)时,给变量c1赋值A,但回车符仍留在缓冲区内;执行输入语句
scanf(“%c”,&c2)时,变量c2将接收一个回车符而使输入结束。输入结果中c2没有赋值。如果输入AB后回车,那么输出结果为:c1 is A,c2 is B
main()主函数
每一C 程序都必须有一main()函数, 可以根据自己的爱好把它放在程序的某
个地方。有些程序员把它放在最前面, 而另一些程序员把它放在最后面, 无论放
在哪个地方, 以下几点说明都是适合的。
1. main() 参数
在Turbo C2.0启动过程中, 传递main()函数三个参数: argc, argv和env。
* argc: 整数, 为传给main()的命令行参数个数。
* argv: 字符串数组。
在DOS 3.X 版本中, argv[0] 为程序运行的全路径名; 对DOS 3.0
以下的版本, argv[0]为空串("") 。
argv[1] 为在DOS命令行中执行程序名后的第一个字符串;
argv[2] 为执行程序名后的第二个字符串;
...
argv[argc]为NULL。
*env: 安符串数组。env[] 的每一个元素都包含ENVVAR=value形式的字符
串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR的对应值如C:\DOS, C:
\TURBOC(对于PATH) 或YES(对于87)。
Turbo C2.0启动时总是把这三个参数传递给main()函数, 可以在用户程序中
说明(或不说明)它们, 如果说明了部分(或全部)参数, 它们就成为main()子程序
的局部变量。
请注意: 一旦想说明这些参数, 则必须按argc, argv, env 的顺序, 如以下
的例子:
main()
main(int argc)
main(int argc, char *argv[])
main(int argc, char *argv[], char *env[])
其中第二种情况是合法的, 但不常见, 因为在程序中很少有只用argc, 而不
用argv[]的情况。
以下提供一样例程序EXAMPLE.EXE, 演示如何在main()函数中使用三个参数:
/*program name EXAMPLE.EXE*/
#include
#include
main(int argc, char *argv[], char *env[])
{
int i;
printf("These are the %d command- line arguments passed to
main:\n\n", argc);
for(i=0; i<=argc; i++)
printf("argv[%d]:%s\n", i, argv[i]);
printf("\nThe environment string(s)on this system are:\n\n");
for(i=0; env[i]!=NULL; i++)
printf(" env[%d]:%s\n", i, env[i]);
}
exit 函数
函数名: exit
功 能: 终止程序
用 法: void ex
it(int status);
#include
#include
#include
int main(void)
{
int status;
printf("Enter either 1 or 2\n");
status = getch();
/* Sets DOS errorlevel */
exit(status - '0');
/* Note: this line is never reached */
return 0;
}