???????
目录
?对字符串的操作是不可或缺的一部分。标准库提供了如strcpy、strcat、strcmp等基础字符串处理函数,以及它们的“限定长度”版本strncpy、strncat和strncmp。为了深入理解这些函数的工作原理,我们首先将分别展示其标准版自定义实现,然后探讨它们的限定长度版本。
char* my_strcpy(char *dest, const char *src) {
assert(dest != NULL);
assert(src != NULL);
char* set = dest;
while (*dest++ = *src++)
;
return set;
}
my_strcpy
函数负责完整地将源字符串src
复制到目标字符串dest
中,并确保包含结束符\0
。
void my_strcat(char *dest, const char *src) {
char* set = dest;
while (*dest != '\0') {
dest++;
}
while ((*dest++ = *src++) != '\0')
;
return set;
}
my_strcat
函数将源字符串src
追加到目标字符串dest
的末尾,同样确保结果字符串以\0
结束。
int my_strcmp(char* dest, char* src) {
while (*dest == *src) {
if (*dest == '\0') {
return 0;
}
dest++;
src++;
}
return (*dest > *src) - (*dest < *src);
}
my_strcmp
用于比较两个字符串的内容,根据字典顺序返回整数值:相等则为0,dest
大于src
时为正数,反之为负数。
void my_strncpy(char *dest, char* src, int count) {
assert(*dest && *src);
char* set = dest;
while (count-- && (*dest++ = *src++))
;
if (count >= 0) {
*dest = '\0';
}
return dest;
}
my_strncpy
函数仅复制源字符串src
最多count
个字符到目标字符串dest
中,如果src
的字符数量小于count
,则剩余空间填充'\0'。
void my_strncat(char* dest, char* src, int count) {
assert(*dest && *src);
char* set = dest;
while (*dest != '\0') {
dest++;
}
while (count-- && (*dest++ = *src++))
;
if (count >= 0) {
*dest = '\0';
}
return set;
}
my_strncat
函数将源字符串src
最多count
个字符追加到目标字符串dest
末尾,并确保结果字符串以'\0'结束。
int my_strncmp(const char* dest, const char* src, int count) {
assert(dest && src);
int i = 0;
while (i < count && *dest == *src && *dest != '\0') {
i++;
dest++;
src++;
}
if (i == count || *dest == '\0' || *src == '\0') {
return 0;
}
else {
return *dest - *src;
}
}
my_strncmp
函数比较两个字符串的前count
个字符,当达到指定字符数或遇到任一字符串的结束符时停止比较,并返回相应的字符差值。
????????在主函数(main)中,通过实际调用这些自定义函数并对比C标准库函数,我们可以验证它们的功能正确性,并进一步掌握字符串操作函数的底层逻辑。