strlen
计算字符串长度
size_t strlen(const char *str)
计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
函数实现:
int Strlen(const char *str) { assert(str); int len = 0; while ((*str++) != '\0')len++; return len; }
strcpy
字符串复制
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。
函数实现:
char *Strcpy(char *dst, const char *src) { assert(dst && src); char *tmp = dst; while ((*dst++ = *src++) != '\0'); return tmp; }
strncpy
复制连续的n个字符
char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
函数实现:
char *Strncpy(char *dst, const char *src, int len) { assert(dst&&src); char *tmp = dst; int offset = 0; if (len > strlen(src)) { offset = len - strlen(src); len = strlen(src); } while (len--) { *dst++ = *src++; } while (offset--) { *dst++ = '\0'; } return tmp; }
strcat
把一个字符串连接到另一个字符串后面
char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
函数实现:
char *Strcat(char *dst, const char* src) { assert(dst && src); char *tmp = dst; while (*dst++); dst--; while (*dst++ = *src++); return tmp; }
strncat
把连续的n个字符连接到另一个字符串后面
char *strncat(char *dest, const char *src, size_t n)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
函数实现:
char *Strncat(char *dst, const char* src, int len) { assert(dst && src); char *tmp = dst; while (*dst++); dst--; while (len--) { *dst++ = *src++; } *dst = '\0'; return tmp; }
示例:
#include #include int main(void) { char str0[20] = "Test:"; char str1[20] = "Welcome9999"; char str2[20] = " To "; char str3[20] = "0123Beijing55"; char tmp[100]; strcpy(tmp, str0); puts(tmp); //Test: strncpy(tmp, str1, 7); //取st1前7个字符 puts(tmp); //Welcome strcat(tmp, str2); //连接str2 puts(tmp); strncat(tmp, str3 + 4, 7); //取str3+4之后的7个字符 puts(tmp); return 0; }
输出结果:
strchr
查找某字符在字符串中首次出现的位置指针,如果不存在则返回NULL
char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
函数实现:
char* My_strchr(char *s, char c) { while(*s != '\0' && *s != c) { ++s; } return *s==c ? s : NULL; }
示例:
#include #include int main(void) { char string[20] = "This is a string"; char *ptr1, *ptr2; char c1 = 'r', c2 = 'b'; ptr1 = strchr(string, c1); ptr2 = strchr(string, c2); if(ptr1) printf("字符1:%c 的位置是: %s \n",c1,ptr1); else printf("字符1:%c 未找到 \n", c1); if(ptr2) printf("字符2:%c 的位置是: %s \n",c2,ptr2); else printf("字符2:%c 未找到 \n", c2); return 0; }
输出结果:
strcmp
字符串比较
int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
设这两个字符串为str1,str2, 若str1=str2,则返回零; 若str1str2,则返回正数。
函数实现:
int Strcmp(char const *s1, char const *s2) { assert(s1&&s2); while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0') { s1++; s2++; } if (*s1 == *s2) { return 0; } else if (*s1 > *s2) { return 1; } return -1; }
示例:
#include #include int main(void) { char str1[20] = "abc"; char str2[20] = "abc"; char str3[20] = "bbc"; int r1, r2, r3; r1 = strcmp(str1, str2); r2 = strcmp(str1, str3); r3 = strcmp(str3, str1); printf("r1 = %d, r2 = %d, r3 = %d \n", r1, r2, r3); return 0; }
输出结果:
strstr
字符串查找
char *strstr(const char *haystack, const char *needle)
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
函数实现:
char *Strstr(char const *s1, char const *s2) { assert(s1&&s2); const char *ps1, *ps2; ps1 = s1; ps2 = s2; while (*ps1) { const char *tmp = ps1; while (*tmp++ == *ps2++); if (*ps2 == '\0') { return (char*)ps1; } ps2 = s2; ps1++; } return NULL; }
strncmp
int strncmp(const char *str1, const char *str2, size_t n)
把 str1 和 str2 进行比较,最多比较前 n 个字节。
函数实现:
int Strncmp(char const *s1, char const *s2, int len) { assert(s1&&s2); while (len-- && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') { s1++; s2++; } return *s1 - *s2; }
memcpy
内存复制
void *memcpy(void *dest, const void *src, size_t n)
从 src 复制 n 个字符到 dest。
函数实现
void *Memcpy(char *dst, char const *src, int len) { assert(dst && src); char *tmp = dst; const char *s = src; while (len--) { *dst++ = *src; } return tmp; }