C语言string类的实现
根据给定的代码片段,我们可以深入探讨C语言中与字符串操作相关的知识点,这些知识点主要集中在字符串的处理函数上,如反转、求长度、复制、截取、填充、查找字符、连接、子串搜索以及内存复制等操作。下面将对每个函数进行详细解析。 1. **字符串反转** - `strrev` ```c char* strrev(char *s) { char *h = s; char *t = s; while (*t++) {}; // 找到字符串末尾 t--; // 回退一个位置,指向最后一个非空字符 while (h < t) { // 当头部指针小于尾部指针时执行 char ch = *h; *h++ = *t; // 将尾部字符复制到头部 *t-- = ch; // 将头部字符复制到尾部 } return (s); } ``` 这个函数接收一个字符数组的指针作为参数,用于反转字符串。它通过两个指针,一个从头开始,另一个从尾开始,逐次交换两个指针所指向的字符,直到两个指针相遇或交错。 2. **字符串长度计算** - `strlen` ```c int strlen(const char *str) { assert(str != NULL); int len = 0; while (*str++ != '\0') ++len; return len; } ``` 此函数用于计算字符串的长度,不包括终止符`\0`。它通过遍历整个字符串直到遇到`\0`,并累加计数器来完成。 3. **字符串复制** - `strcpy` ```c char* strcpy(char *to, const char *from) { assert((to != NULL) && (from != NULL)); char *result = to; while ((*to++ = *from++) != '\0') NULL; return result; } ``` `strcpy`函数用于将一个字符串(`from`)完整地复制到另一个字符串(`to`)。它通过将`from`中的每一个字符复制到`to`中,直到遇到`\0`为止。 4. **字符串截取复制** - `strncpy` ```c char* strncpy(char *to, const char *from, size_t count) { assert((to != NULL) && (from != NULL)); char *result = to; while (count--) { if (*from != '\0') { *to++ = *from++; } else { *to++ = '\0'; } } return result; } ``` `strncpy`函数用于从源字符串中复制最多`count`个字符到目标字符串中。如果源字符串在复制`count`个字符前结束,则会在目标字符串的末尾添加`\0`,否则可能不会自动添加终止符。 5. **内存填充** - `memset` ```c void* memset(void *buffer, int c, size_t count) { assert(buffer != NULL); char *p = (char *)buffer; while (count--) *p++ = (char)c; return buffer; } ``` `memset`函数用于将指定数量的字节填充为特定值。在这个例子中,它将`buffer`指向的前`count`个字节设置为`c`的值。 6. **字符查找** - `strchr` ```c char* strchr(char *str, int c) { assert(str != NULL); for (; *str != (char)c; ++str) if (*str == '\0') return NULL; return str; } ``` `strchr`函数用于在字符串中查找第一次出现的指定字符的位置。如果找到,返回该字符的地址;否则返回`NULL`。 7. **字符串连接** - `strcat` ```c char* strcat(char *strDes, const char *strSrc) { assert((strDes != NULL) && (strSrc != NULL)); char *address = strDes; while (*strDes != '\0') ++strDes; while ((*strDes++ = *strSrc++) != '\0') NULL; return address; } ``` `strcat`函数用于将`strSrc`字符串追加到`strDes`字符串的末尾。 8. **字符串子串搜索** - `strstr` ```c char* strstr(const char *strSrc, const char *str) { assert(strSrc != NULL && str != NULL); const char *s = strSrc; const char *t = str; for (; *strSrc != '\0'; ++strSrc) { for (s = strSrc, t = str; *t != '\0' && *s == *t; ++s, ++t) NULL; if (*t == '\0') return (char*)strSrc; } return NULL; } ``` `strstr`函数用于在一个字符串(`strSrc`)中查找子串(`str`)的首次出现。如果找到,返回子串的起始位置;否则返回`NULL`。 9. **字符串复制(动态分配)** - `strdup_` ```c char* strdup_(char *strSrc) { if (strSrc != NULL) { char *start = strSrc; int len = 0; while (*strSrc++ != '\0') len++; char *address = (char*)malloc(len + 1); assert(address != NULL); while ((*address++ = *start++) != '\0'); return address - (len + 1); } return NULL; } ``` `strdup_`函数用于动态分配内存,并复制一个字符串到新分配的内存区域。注意这里的返回值计算方式有误,应该直接返回`address`。 10. **内存复制** - `memcpy` ```c //memcpy()函数未完整给出,但通常用于将一块内存的内容复制到另一块内存中。 ``` `memcpy`函数用于将源内存区域的内容复制到目标内存区域,通常不检查目标和源是否重叠。 这些函数构成了C语言中处理字符串的基本工具集,它们的正确使用对于字符串处理任务至关重要。理解每个函数的工作原理和适用场景是编写健壮、高效的C程序的关键。
char* strrev(char* s)
{
/* h指向s的头部 */
char* h = s;
char* t = s;
char ch;
/* t指向s的尾部 */
while(*t++){};
t--; /* 与t++抵消 */
t--; /* 回跳过结束符'\0' */
/* 当h和t未重合时,交换它们所指向的字符 */
while(h < t)
{
ch = *h;
*h++ = *t; /* h向尾部移动 */
*t-- = ch; /* t向头部移动 */
}
return(s);
}
//字符串长度
int strlen(const char *str)
{
assert(str != NULL);
int len = 0;
while (*str ++ != '\0')
++ len;
}
//字符串拷贝
char *strcpy(char *to, const char *from)
{
assert((to != NULL) && (from != NULL));
char * result = to;
while( (*to++ = *from++) != '\0')
NULL;
return result;
}
//strncpy(),如果from指向的字符个数少于count,则用'\0'补齐
char *strncpy(char *to, const char *from, size_t count)
{
assert((to != NULL) && (from != NULL));
char * result = to;
while(count--)
{
if(*from != '\0')
{
*to++ = *from++;
}
else
{
*to++ = '\0';
}
}
return result;
}
剩余10页未读,继续阅读
- 沐_风2013-08-01非常实用,结构清晰,
- ngw4182014-02-14可以使用,谢谢。
- dlhszn1mcc2020-08-07这只是一些常见字符串操作的源码实现,而且不是C库的实现,手写的那种。比如strlen、strncpy、memset等。也不是用C语言实现的类似C++的String类。描述得不清楚,包含的内容也太少,积分要得太高,不值。
- 粉丝: 1
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助