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 ); | 返回字符串长度 | |
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.
|
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相同仅参数类型不同.方便程序员编写自己的格式化输出函数 |
源码: