C语言基础(03-先学2个库函数)
C语言中的库函数――我们编写C语言程序时要写许多代码,这些代码是用基本程序语句如运算符、表达式、几种语句结构来组成。这些语句组成了多个不同的函数,由多个函数组成一个完整的程序。实际上如果程序中的语句都要由自己来写的话,那么工作量是很大的了。并且有一些完成基本任务的函数如输入输出函数是经常需要使用的。这样的一些常用的完成基本任务的函数有许多已经由提供编译程序的公司为我们写好了。这些已经写好的函数放在TC或者BC编译器的文件中。所谓“库函数”,就是存放“函数”的“仓库”。在TC中,函数的“仓库”在哪里呢?在TC的.\LIB目录中。编写程序的时候,如果我们需要使用某个库函数,就要在这个程序开头指明这库函数存放在哪里,以便让编译程序到这个地方去找。这个指明库函数路径的语句称为“包含”语句,写做#include。完整的写法是:6 L3 ?3 U9 ~# R0 s/ L% h2 h# K$ K* K+ s2 Y
#include <stdio.h>
/ n) y8 W) h8 ~/ {- d9 x#include 是包含的意思,<stdio.h> 是指明要使用的库函数在 stdio.h这个文件里面有说明。尖括号<>是必须要写的。而实际上,编译程序在stdio.h之个文件里根据库函数名可以在.\LIB目录下的LIB文件里找到相关的代码,写进程序里面去。使用不同的库函数时要用不同的包含,关于怎样使用#include,可以查看库函数的帮助。
( y0 y* ?" b# Y8 c- K有了众多的库函数,给编写程序带来了很大的方便。就象做房子要用砖和瓦一样。如果没有砖和瓦,做房子自己要挖土烧砖,可想而知,那样做房子的难度有多大。写程序也是这样,有了库函数,在需要完成某些任务时,找到相应的库函数调用一下就可以了,不需要自己一点一点的写代码。在学习编程的同时要多多了解一些库函数的特点及用法,对编写程序是有很大的好处的。
/ E6 P$ o0 g: R8 S9 d6 S(在Windows下编写程序,需要了解的“库函数”就更多了,可以说不了解库函数就不会编程。VC中用的是MFC,Win32中用的是API,它们都是函数库)
6 e, i) o4 ?! @, x& t# I
" }1 R- g7 J4 [1 t5 @% ?9 M先了解二个库函数――1、scanf函数 /*格式化控制台输入函数*/
& Y9 r8 v9 s: c+ F8 j/ ]( h: G函数原型:int scanf(control_string....); /*看上去很复杂。没关系,以后自然会明白的*/8 O6 I1 g- K7 p% B$ E' z. s5 l4 h: e# \
使用例:" W. C% B% `4 `( b8 N
void main()
) m% {5 L- X* l4 b: E{
3 V1 K$ Y2 O( V$ `. {7 d7 r int a,b,c; /*定义了三个整型变量*/
) E" X K6 W; Z/ g+ Q scanf("%d%d",&a,&b); /*从键盘输入二个整数到娈量a和b中*/
1 ^0 O( k b( F- o" Q c=a+b; /*把变量a与b相加的和送给变量c*/
" r- @9 t3 h' B# a) N) E+ n' t) _}' J d6 W7 g) v2 U
0 t" Z( z Z! C w D
下面仔细讲一下scanf函数各参数的用法:
! [' r. m$ R l7 T- }可以看到在小括号里有二个%d,后面有二个变量a和b。二个%d的写法为"%d%d",注意凡是这样的符号都要写在双引号里面,而变量则写在双引号的外面并用逗号分隔。这个%d我们称为格式化说明符,第一个%d用于说明第一个变量a,第二个%d用于说明第二个变量b,这样的顺序是一一对应的。%d格式符说明了后面输入的变量值是整型数。% q+ a' X2 T0 Z- w5 @/ p# Z6 x
另外注意的是二个%d是靠在一起的 %d%d,凡是这样的写法,在输入数时,对于二个数之间的分隔是用“空隔键”来实现的。如输入30和50这二个数形式为 30 50 如果二个%d写成%d,%d中间有一个逗号,那么在输入数据时也一定要在输入的数之间加上逗号,如 30,50。
0 D; O6 Q* R: p/ j0 S( `再来看一下变量的写法,可以看到在每一个变量名的前面都有一个&号,这个&号是取变量地址的意思,那么&a写在一起就是变量a的地址,&b写在一起就是变量b的地址。
! W6 p- f& Y* f/ @9 B' v上面的scanf函数的作用就是把从键盘上输入的二个整数分别送到变量a和变量b的地址里面去。这个&号是非常重要,不要写漏了。9 P$ M+ x% |5 B
2 c. o. |0 ~( T# T, |
scanf函数的格式说明符(格式说明符说明了下一步将读的是什么类型的数据)% t9 J% {- n1 k% s5 n( r
0 ?6 X' \6 s1 t7 B2 l
3 R* B* n- ]0 K5 d8 K格式码 含义 " E& ~: E+ @+ v- n- f; h
%c 读一单字符
0 [" n6 ~! u/ e%d 读一整数 ! S9 b! I' w! c2 ]. T* Z, D% F
%i 读一个浮点数
0 g4 u P1 g+ g%e 读一个浮点数 & j6 i* ^% q2 G
%f 读一个浮点数 & c* m- f$ T6 P& Y" c* {: z
%g 读一个浮点数
" s* ?1 {3 }, j( ]' e2 h8 s%o 读一个八进制数
: G3 ^1 z; V8 o%s 读一字符串 $ D- }# e3 @/ J( a" s- Y# [
%x 读一十六进制数
8 C1 {% z8 g0 G# Q- T%p 读一指针 ; J1 L; S* \. f/ ]4 g0 d) U# r
%n 读一个指针收一个等于到目前为止输入的字符数止的整数 " i" p3 I' l6 P$ E
%u 读一无符号整数 5 I+ b0 ]: b) `6 B
%[] 扫描一字符集 , q+ i, v) I5 |5 P) c. v" W4 Q4 V
9 O1 i' v) |! w6 P, d) u" `" N
例:从键盘输入二个字符,一个大写,一个小写,然后把这个小写字符转换成大写,大写字符转换成小写。1 M( |. [' c$ ~; A9 V( J) Q _! \
#include<stdio.h> /*因为在程序里用到了库函数scanf,所以要使用包含#include<stdio.h>*/. k/ b7 H6 V& K* g# O
void main()0 @" r. h; C S0 L9 a' E
{
) Q) c$ ]; M% O, B# L n0 x char ch,chh; /*定义了二个字符型变量*/! w1 m" S- A& }2 s; J, ]# s
scanf("%c%c",&ch,&chh); /*从键盘输入二个字符,一个大写,另一个小写*/
' y1 v# [' b4 V* s$ B ch=ch+32; /*大写转成小写*/
! ]; A; {: F0 d chh=chh-32; /*小写转成大写*/8 f+ q7 M: `" f0 b
}& q& h, q4 H4 p
% U$ H3 S6 i y6 F0 D+ r4 D9 G
- O+ [! E! y+ X" z# T) B2、printf函数 /*格式化输出函数*/7 [5 v- L# l4 w! y$ g! N) }& U2 W9 f
函数原型:int printf(const char *control_string....);
# D, S8 h2 j. X: T; Q" _) O说明:printf把变量的值或常量字符串输出到控制台(一般是显示屏)) Z' C4 y* w; B
使用例:
# Y4 A/ a6 K" P/ G1 a; h#include<stdio.h>$ P- [8 h0 R! L
void main()5 v7 s, b) o. N7 w- `+ b; U
{8 |: } W8 k$ t2 I( [. \- n) j4 Q( U
int a,b,c;
2 `% _/ e. X9 t scanf("%d%d",&a,&b);+ |* h2 K" Q; W; N
c=a+b;9 ]: R8 w3 B. l3 I( t4 w0 I
printf("输出二个整数相加的和"); /*输出字符串常量,这里没有用到格式化说明符*/, ^( l4 e( i9 _- x/ _
printf("%d",c); /*把变量c的值用整型格式输出,这里%d是整型格式说明符*/7 m9 R7 t/ M; l3 ~0 j- t
}+ M1 Q3 M* P2 c) ]1 Z. q
3 z: a" Z& p# b+ w3 q6 ~如果有几个变量的值要输出,用这样的形式:printf("%d %d %d",a,b,c);
: ^7 M) L( p8 `' [ t/ N5 ^从这个printf输出的格式中看出,每一个格式符对应一个变量,其对应顺序也是一一对应的,第一个%d对应第一个变量a,以此类推。注意在printf函数中,变量前面就不要加&符号了。
4 {% c2 h7 F$ [+ T* _$ W5 e注意printf函数中几个%d之间留了一些空格,这里的用法与scanf相比有一点不同。在printf函数中格式符之间留多少空隔,输出的时候每一个输出的值之间就有多少空隔。如printf("%d %d %d",a,b,c);输出则为:20 30 50 (这里的数是假设的)。如果写为printf("%d,%d,%d",a,b,c);则输出形式为 20,30,500 K8 {$ Q6 N6 J# X6 h
o/ [) A0 y$ l! ?2 Nprintf函数的格式符:
; t6 V7 r! E- \5 [& Q! o0 q: [# U$ H
# b3 p, _- b' D4 w4 l+ }4 h+ L; |/ d1 V a0 T6 E+ Q, o
格式码 格式 2 u8 U* J# }+ f1 X( N& Z0 V2 `4 s
%c 单个字符
# F- Q3 o' q u3 P5 j- y%d 十进制数
5 C: E- F, g9 R8 G/ X%i 十进制数 + ~% m' j5 G+ ^1 J; x
%e 科学法表示 ! P. L8 I, f* _1 {
%E 科学法表示 - R" `; N. s& Z( B/ {4 ^( D
%f 十进制浮点数 2 @$ t* c- R2 F( s# G
%g 用%e或%f中较短的的一个(如果是%e,用小写e)
7 o$ T. z7 S& L1 U+ @ N%G 用%e或%f中较短的的一个(如果是%E,用大写E) " j, O' J2 I1 ]" [
%o 以八进制形式输出 8 v8 G6 A, e3 \& }8 d+ k# o- Z4 ?% m" H
%s 字符串 " H; T2 }) l( v
%u 无符号十进制数
T$ u: b# g# ^%x 十六进制数(小写) - T ~8 x/ J; E( S
%X 十六进制数(大写) * p% ~# x+ _% G$ t3 _0 f+ o2 R
%p 显示一个指针
3 g+ y8 K, ?7 F. R%n 相关变量是整型指针,它所指处存放至今要写入字符的总数
, m1 l) {+ c1 t%% 打印一个%号 3 K" u3 V9 H' X: R- ]6 D
% F) s& x) ]& m9 k5 [+ R3 j
printf函数使用例:
( m" f3 d2 Y4 T. X2 F0 f% h1)char ss="abcdefghijk"; printf("%s",ss); /*输出一个字符串,屏幕上显示"abcdefghijk"*/4 Z1 ]) E, m" z* c
2)unsigned int a=65535; printf("%u",a); /*以十六进制形式输出一个无符号数,显示为ffff*/
4 x! `& L% E3 N4 w- C3)int a=123,b=456,c=687; printf("%d\t%d\n%d",a,b,c);5 O, ^/ U- V7 C {
输出形式为:
& |2 e9 Y- S3 d! f2 c 123 456 /*'\t'是一个制表符,所以要移动一个制表位这么多空格数*/
8 E+ S9 e8 h- r! B+ p 687 /*'\n'是换行转义符,在前面字符常量里讲过。所以要换一行再输出687*/