yunshichen

我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎

C语言速记 第五章 标准库函数

Chapter 5 标准库函数

5.1 库函数集合

    C语言的标准库函数集合有:
    <stdio.h> : 标准输入输出函数集合.
    <ctype.h> : 判断字符类型(是否大写,数字,空格)的函数集合.
    <string.h> :  操作字符串的函数集合.
    <math.h>   :  数学应用相关函数集合.
    <stdlib.h> :  工具集,包括类型转换和一些系统函数.
    <assert.h> :  增加断言功能的集合.
    <stdarg.h> :  不定参数的工具包.例如printf函数就用到此包.
    <setjmp.h> :  支持函数跳转功能的集合.
    <signal.h> :  处理中断的集合.
    <time.h>   :  处理日期和时间的集合.
    <limits.h> :  整数类型最大值和最小值集合.和具体实现有关.
    <float.h>  :  浮点类型最大值和最小值集合.和具体实现有关.

    以下通过实例简要介绍标准库内的函数.如果有所缺漏,请参考 http://www.cplusplus.com/ 获取更多函数用法.

5.2 字符串操作

    所处头文件: string.h . 常用字符串函数如下:

函数原型

函数说明

应用注意

size_t strlen ( const char * str );

 

返回字符串长度

  • 该字符数组必须包含’\0’结束符.

char * strcpy ( char * dest, constchar * src );

 

复制源字符串到目标字符串,包括NULL结束符

  • 目标字符串的缓冲区长度必须比源字符串的长度大
  • 两个字符串的内存区域不能重叠

char * strncpy ( char * dest, constchar * src, size_t num );

 

从源字符串复制num个字符到目标字符串

  • 目标字符串的缓冲区长度必须比源字符串的长度大
  • 两个字符串的内存区域不能重叠
  • 如果num>源字符串长,NULL结束符会自动附加到目标字符串.
  • 如果num<=源字符串长,则必须手动加上NULL结束符.

 

char * strcat ( char * dest, constchar * src );

 

将源字符串附加到目标字符串

  • 目标字符串必须有足够的缓冲区
  • 两个字符串的内存区域不能重叠
  • 目标字符串原来的NULL结束符会被源字符串的首字符覆盖,在连接完成之后,NULL会被自动添加到目标字符串末尾.

intstrcmp ( constchar * str1, constchar * str2 );

 

比较字符串是否相等.如果相等则返回0,否则返回第一个不等字符的差值

  • 由于字符串相等时返回0,注意不要用if(strcmp(s1,s2)){...}的程序风格.

constchar * strchr ( constchar * str, int character );

 

从字符串中查找字符,返回该字符首次出现的指针.如果找不到该字符,则返回NULL

 

char * strtok ( char * str, constchar * delimiters );

 

按分隔符分割字符串

  • 分割完成后,源字符串的内容会被改变,所有分隔符会被替换为NULL.
  • 第二次调用时,输入NULL代替str

void * memcpy ( void * dest, constvoid * src, size_t num );

 

从源指针的内存区域复制num个字节的内容到目标指针的内存区域.

  • 目标指针指向的缓冲区长度必须比源内存大
  • 如果指针指向字符串,并不保证一定能复制NULL到目标字符串.
  • 源指针和目标指针的内存区域不能重叠.

void * memmove ( void * dest, constvoid * src, size_t num );

 

类似memcpy函数,区别是源指针和目标指针的内存区域可以重叠.

  • 如果指针指向字符串,并不保证一定能复制NULL到目标字符串.
  • 源指针和目标指针的内存区域可以重叠.
  • 慎用此函数

constvoid * memchr ( constvoid * ptr, int value, size_t num );

 

ptr指向的num字节的内容中查找字符.如果找不到该字符则返回NULL

 


    实例:
#include <stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
void strlenSample();
void strcpySample();
void strncpySample();
void strcmpSample();
void memmoveSample();

int main() {
    
//strlenSample();
    
//strcpySample();
    
//strncpySample();
    
//strcmpSample();
    memmoveSample();
    
}
void memmoveSample() {
    puts(
"Sample of using memmove and memcpy.");
    
char s1[]="I am  Diego.";
    
char *p=s1;
    memmove(p,p
+5,5);    
    puts(s1);
    
    
long dest[]={50000,60000,70000,80000,90000};
    
char src[]={'a','b','c','d'};
    memcpy(dest,src,
3);    
    
    
int i=0;
    
for(;i<5;i++){
        printf(
"%ld\t",dest[i]);
    }
    
}


void strlenSample() {
    puts(
"Sample of using strlen.");
    
char* s1 = "test1";
    
int r=strlen(s1);
    printf(
"1.len is:%d\n", r);

    
char* s2="te\0st";
    r
=strlen(s2);
    printf(
"2.len is:%d\n", r);

    
char s3[]= { 'a''b''c''\0''d''\0' };
    r
=strlen(s3);
    printf(
"3.len is:%d\n", r);

}

void strcpySample() {
    puts(
"Sample of using strcpy.");
    
char* s1="test1";
    
char s2[6];
    strcpy(s2, s1);
    
int r=strlen(s2);
    printf(
"1.len is:%d\n", r);
    
    
char s3[2];//Buffer is not enough , will causes bug protentially.
    strcpy(s3, s1);
    r
=strlen(s3);
    printf(
"2.len is:%d\n", r);

}

void strncpySample() {
    puts(
"Sample of using strncpy.");

    
char* s1="test1";
    
char s2[20];
    
int n=10;
    
//n > lenOfs1 , NULL will be copied automatically.
    strncpy(s2, s1, n);
    
int r=strlen(s2);
    printf(
"1.len is:%d and s2 is %s \n", r, s2);


    
char s3[20];
    n
=2;
    
//n < lenOfs1 ,you must add NULL manually.
    strncpy(s3, s1, n);
    s3[n]
='\0';//comments this statement and you will get a incorrect result.
    r=strlen(s3);
    printf(
"2.len is:%d and s3 is %s \n", r, s3);

    

}


void strcmpSample() {
    puts(
"Sample of using strcmp.");
    
char* s1="test1";
    
char* s2="test2";
    
char* s3="testsss3";
    
char* s4="t4";
    
int r = strcmp(s1, s2);
    
if (r) {
        printf(
"1.Result is:%d\n", r);
    } 
else {
        printf(
"1.1 Result is:%d\n", r);
    }
    r 
= strcmp(s1, s3);
    
if (r) {
        printf(
"2.Result is:%d\n", r);
    } 
else {
        printf(
"2.1 Result is:%d\n", r);
    }
    r 
= strcmp(s1, s4);
    
if (r) {
        printf(
"3.Result is:%d\n", r);
    } 
else {
        printf(
"3.1 Result is:%d\n", r);
    }
    r 
= strcmp(s1, s1);
    
if (r) {
        printf(
"4.Result is:%d\n", r);
    } 
else {
        printf(
"4.1 Result is:%d\n", r);
    }
}


5.3 标准输入输出

    如果对标准输入缓冲区的概念不熟悉,请参看章节3.1.  

    头文件: <stdio.h> 常用函数: 

函数原型

函数说明

应用注意

int getchar ( void );   

从标准输入读入一个字符

如果输入多于一个字符,程序并不会出错.这些数据将保留在缓冲区,下一个getchar或者gest函数将从缓冲区读取数据.这种情况通常会引起潜在的bug.所以最好调用fflush函数清空缓冲区.

char * gets ( char * str );

从标准输入读入一行字符,键盘输入换行后结束.

换行符会被忽略

int putchar ( int character );

向标准输出输出一个字符

自动增加换行符到标准输出.

int puts ( const char * str );

向标准输出输出一行字符

 

 

int  scanf ( const char * format, ... );

从标准输入读入字符并将其格式化

同样存在缓冲区的问题

遇到空格字符(空格,回车,换行,制表符\t)则返回.

int sscanf ( char * str, const char * format, ...);

从字符串读入字符并将其格式化

同样存在缓冲区的问题

遇到空格字符(空格,回车,换行,制表符\t)则返回.

 

int printf ( const char * format, ... );

按指定格式向标准输出输出字符

如果指定格式和参数实际数据类型不符合,则打印结果会不正确

int sprintf ( char * str, const char * format, ... );

按指定格式向字符数组输出字符

如果指定格式和参数实际数据类型不符合,则打印结果会不正确

 

int vprintf ( const char * format, va_list arg );

按指定格式向标准输出输出字符

作用和printf相同仅参数类型不同.方便程序员编写自己的格式化输出函数

int vsprintf (char * str, const char * format, va_list arg );

按指定格式向字符数组输出字符

作用和vsprintf相同仅参数类型不同.方便程序员编写自己的格式化输出函数



源码:










posted on 2008-05-04 17:17 Chenyunshi 阅读(929) 评论(1)  编辑 收藏 引用 所属分类: C/C++

评论

# re: C语言速记 第五章 标准库函数 2008-05-04 22:06 BT下载

做过这样的网站:http://www.bt285.cn http://www.yaonba.com.cn 呵呵.用的是JAVA,但是C还是要顶的.  回复  更多评论   

只有注册用户登录后才能发表评论。
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

相册

搜索

最新评论

阅读排行榜

评论排行榜