目录
前言
C语言对字符和字符串的处理很频繁,但C语言是没有字符串类型的,字符串通常放在常量字符串中或字符数组中。字符串常量适用于那些对它不做修改的字符串函数。
·求字符串长度
strlen
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符(\0),但不包括空结束字符(\0)。
下面是 strlen() 函数的声明。
size_t strlen(const char *str)
参数
- str -- 要计算长度的字符串。
返回值
该函数返回字符串的长度。且该返回值是无符号整型。
模拟实现:
int my_strlen(const char* str) { int count = 0; assert(str != NULL); while (*str != '\0') { count++; str++; } return count; }
·长度不受限制的字符串函数
strcpy
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
声明
char *strcpy(char *dest, const char *src)
参数
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
模拟实现:
char* my_strcpy(char* dest, const char* str) { assert(dest != NULL); assert(str != NULL); char* ret = dest; while (*dest++ = *str++); return ret; }
strcat
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
声明:
char *strcat(char *dest, const char *src)
参数:
- dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
- src -- 指向要追加的字符串,该字符串不会覆盖目标字符串。
返回值:
该函数返回一个指向最终的目标字符串 dest 的指针。
模拟实现:
char* my_strcat(char* dest, const char* str) { assert(dest != NULL); assert(str != NULL); char* ret = dest; while (*dest != '\0') { dest++; } while (*dest++ == *str++); return ret; }
strcmp
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
声明:
int strcmp(const char *str1, const char *str2)
参数:
- str1 -- 要进行比较的第一个字符串。
- str2 -- 要进行比较的第二个字符串。
返回值:
该函数返回值如下:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
模拟实现:
int my_strcmp(const char* str1, const char* str2) { assert(str1 && str2); while (*str1 && *str2) { while (*str1 == *str2) { if (*str1 != '\0') { return 0; } str1++; str2++; } if (*str1 > *str2) return 1; else return -1; }
·长度受限制的字符串函数介绍
strncpy
C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
声明:
char *strncpy(char *dest, const char *src, size_t n)
参数:
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
- n -- 要从源中复制的字符数。
返回值:
该函数返回最终复制的字符串。
strncat
C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
声明:
char *strncat(char *dest, const char *src, size_t n)
参数:
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
- n -- 要从源中复制的字符数。
返回值:
该函数返回最终复制的字符串。
strncmp
C 库函数 int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。
声明:
int strncmp(const char *str1, const char *str2, size_t n)
参数:
- str1 -- 要进行比较的第一个字符串。
- str2 -- 要进行比较的第二个字符串。
- n -- 要比较的最大字符数。
返回值:
该函数返回值如下:
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str2 小于 str1。
- 如果返回值 = 0,则表示 str1 等于 str2。
字符串查找
strstr
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
声明:
char *strstr(const char *haystack, const char *needle)
参数:
- haystack -- 要被检索的 C 字符串。
- needle -- 在 haystack 字符串内要搜索的小字符串。
返回值:
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
模拟实现:
char* my_strstr(const char* p1, const char* p2) { assert(p1 != NULL); assert(p2 != NULL); char* s1 = NULL; char* s2 = NULL; char* cur = (char*)p1; if (*p2 == "\0") { return (char*)p1; } while (*cur) { s1 = cur; s2 = (char*)p2; while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') { return cur; } cur++; } return NULL; }