第一章:指针、数组与函数
第二章:回调函数
第三章:字符串函数与内存函数
第四章:结构体、枚举、联合
第五章:通讯录
第六章:动态内存管理
第七章:文件操作
第八章:程序环境与预处理
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串
中或者字符数组
中。
字符串常量适用于那些对它不做修改的字符串函数.
size_t strlen ( const char * str );
size_t my_strlen(const char* str)
{
char* start = str;
char* end = str;
while(*end != '\0')
{
end++;
}
return end - start;
}
长度不受限制的字符串函数(‘\0’)
char* strcpy(char * destination, const char * source );
char* mystrcpy(char* dest, const char* src) {
assert(dest);
assert(src);
char* ret = dest;
while (*dest++ = *src++) {
;
}
return ret;
}
char * strcat ( char * destination, const char * source );
char* mystrcat(char* dest, const char* src) {
assert(dest);
assert(src);
char* ret = dest;
while (*dest != '\0') {
dest++;
}
while (*dest++ = *src++) {
;
}
return ret;
}
int strcmp ( const char * str1, const char * str2 );
This function starts comparing the first character of each string. If
they are equal to each other, it continues with the following pairs
until the characters differ or until a terminating null-character is
reached.
标准规定:
int strcmp(const char* str1, const char* str2) {
assert(str1);
assert(str2);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
长度受限制的字符串函数
char * strncpy ( char * destination, const char * source, size_t num );
char * strncat ( char * destination, const char * source, size_t num );
int strncmp ( const char * str1, const char * str2, size_t num );
字符串查找函数
char * strstr ( const char *str1, const char * str2);
Returns a pointer to the first occurrence of str2 in str1, or a null
pointer if str2 is not part of str1.
在一个字符串中找另一个字符串是否存在 存在:返回第一个子字符串首地址 不存在:NULL
char* strstr(const char* str1, const char* str2){
assert(str1 && str2);
while (*str1 != '\0') {
if (*str1 == *str2) {
char* ret1 = str1;
char* ret2 = str2;
while (*str1++ == *str2++) {
if (*str2 == '\0') {
return ret1;
}
}
str2 = ret2;
str1 =++ret1;
}
else {
str1++;
}
}
return NULL;
}
char * strtok ( char * str, const char * sep );
错误信息报告函数
char * strerror ( int errnum );
返回错误码,所对应的错误信息。
int main() {
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
}
结果如下:
No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
0、1、2等是错误码,是C语言中库函数报错的时候的错误码。
库函数会产生错误码并返回到错误码变量(全局变量)中:errno
printf("%s",strerror(errno));
void perror ( const char * str );
字符分类函数
函数 | 如果他的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直|制表符 ‘v’ |
isdigit | 十进制数字 0 ~ 9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a ~ f,大写字母A ~ F |
islower | 小写字母a ~ z |
isupper | 写字母A ~ Z |
isalpha | 字母a ~ z或A ~ Z |
isalnum | 字母或者数字,a ~ z,A ~ Z,0 ~ 9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
字符转换函数
int tolower ( int c );
int toupper ( int c );
内存操作函数
void * memcpy ( void * destination, const void * source, size_t num );
void* my_memcpy(void* dest, const void* src, size_t num) {
int i = 0;
assert(dest && src);
void* ret = dest;
for (i = 0; i < num; i++) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
void * memmove ( void * destination, const void * source, size_t num );
void* my_memcpy(void* dest, const void* src, size_t num) {
int i = 0;
assert(dest && src);
void* ret = dest;
if (dest < src) {
for (i = 0; i < num; i++) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}//前—>后
else {
for (i = num; i > 0; i--) {
*((char*)dest + i) = *((char*)src + i);
}
}//后—>前
return ret;
}
int memcmp ( const void * ptr1,
const void * ptr2,
size_t num );
void * memset ( void * ptr, int value, size_t num );
学会C的库函数的定义,试着去模拟实现。