有没有做任务能兑换现金的网站,排版设计模板,老城网站建设,微商城网站建设策划方案在C语言的编程世界里#xff0c;对文本的精确处理是构建复杂程序的基础。字符与字符串操作看似简单#xff0c;却蕴含着诸多细节与潜在陷阱。本文将系统解析C标准库中核心的字符分类、转换及字符串操作函数#xff0c;不仅讲解其标准用法#xff0c;更通过关键函数的模拟实…在C语言的编程世界里对文本的精确处理是构建复杂程序的基础。字符与字符串操作看似简单却蕴含着诸多细节与潜在陷阱。本文将系统解析C标准库中核心的字符分类、转换及字符串操作函数不仅讲解其标准用法更通过关键函数的模拟实现揭示底层逻辑帮助你从“会用”到“懂原理”从而写出更健壮、高效的代码。目录1.字符分类函数2.字符转换函数3.strlen函数使用和模拟实现4.strcpy函数使用和模拟实现5.strcat函数使用和模拟实现6.strcmp函数使用和模拟实现7.strstr函数使用和模拟实现8.strncpy函数使用和模拟实现9.strncat函数使用和模拟实现10.strncmp函数使用和模拟实现1.字符分类函数C语言中有一系列的函数专门做字符分类的也就是一个字符属于什么类型的字符。这些函数的使用需要包含ctype.h头文件例如islower是判断参数部分是否是小写字母。通过返回值来说明是否是小写字母如果是小写字母就返回非0的整数如果不是则返回0。下题将小写字母转换为大写#include stdio.h #include ctype.h int main () { int i 0; char str[] Test String.\n; char c; while (str[i]) { c str[i]; if (islower(c)) c - 32; putchar(c); i; } return 0; }2.字符转换函数C语言提供了2个字符转换函数toupper ----- 小写转大写tolower ----- 大写转小写上面的代码我们使用-32完成小写转大小有了转换函数我们就可以直接使用tolower函数完成转换。#include stdio.h #include ctype.h int main() { int i 0; char str[] Test String.\n; char c; while (str[i]) { c str[i]; if (islower(c)) c toupper(c); putchar(c); i; } return 0; }3.strlen函数使用和模拟实现作用计算字符串的长度。注意字符串的长度不包括字符\0。返回值是int型#include stdio.h #include string.h int main() { const char* str1 abcdef; const char* str2 hijkl; if (strlen(str2) - strlen(str1) 0) { printf(str2str1\n); } else { printf(srt1str2\n); } return 0; }模拟实现//法一 int my_strlen(char* s) { assert(s); char* p s; while (*p) { p; } return p - s; } //法二 int my_strlen1(char* p) { int count 0; while (*p) { count; p; } return count; } int main() { char s1[] jakdhfbasdha; int ret my_strlen(s1); int ret1 my_strlen1(s1); printf(%d\n, ret); printf(%d\n, ret); return 0; }4.strcpy函数使用和模拟实现作用将源节点指向的C字符串复制到目的地指向的数组中包括终止的空字符并在该点停止。源字符串必须以 \0结束。会将源字符串中的 \0拷贝到目标空间。目标空间必须足够大以确保能存放源字符串。目标空间必须可修改。int main() { char* str1 abcdef; char* str2; // 把str1的内容拷贝到str2参数为字符数组指针 strcpy(str2, str1); printf(str2 %s\n, str2); // str2 abcdef return 0; }模拟实现char * my_strcpy(char* p, char* q) { assert(p); assert(q); while (*p *q) { p; q; } return p; } int main() { char str1[10]; char str2[] abcdef; my_strcpy(str1, str2); printf(%s, str1); return 0; }a5.strcat函数使用和模拟实现作用将字符串str2添加到字符串str1的尾部即拼接两个字符串。源字符串必须以\0结束。目标字符串中也得有 \0否则没办法知道追加从哪⾥开始。目标空间必须有足够的⼤能容纳下源字符串的内容。目标空间必须可修改。int main() { char str1[] abcde ; char str2[] fghij; strcat(str1, str2); printf(%s\n, str1); //abcde fghij return 0; }模拟实现char* my_strcat(char* p, const char* q) { while (*p) { p; } while (*q) { *p *q; p; q; } *p \0; return p; } int main() { char str1[20] abcdef; char* str2 hijklmn; my_strcat(str1, str2); printf(%s, str1); return 0; }6.strcmp函数使用和模拟实现作用比较两个字符串长度第⼀个字符串大于第⼆个字符串则返回大于0的数字第⼀个字符串等于第⼆个字符串则返回0第⼀个字符串小于第⼆个字符串则返回小于0的数字int main() { char str1[] abcdef; char str2[] abcdef; char str3[] abd; int ret1 strcmp(str1, str2); //ret10 int ret2 strcmp(str1, str3); //ret21 return 0; }模拟实现int my_strcmp(const char* str1, const char* str2) { while (*str1 *str2) { if (*str1 \0) return 0; str1; str2; } return *str1 - *str2; } int main() { char* str1 abcde; char* str2 abcdf; int ret my_strcmp(str1, str2); if (ret 0) { printf(str1str2\0); } else if (ret 0) { printf(str1str2\n); } else printf(str1str2\n); return 0; }7.strstr函数使用和模拟实现作用函数返回字符串str2在字符串str1中第⼀次出现的位置int main() { char str[] This is a simple string; char* pch; pch strstr(str, simple); printf(%s\n, pch); strncpy(pch, sample, 6); printf(%s\n, str); return 0; }模拟实现char* my_strstr(const char* p, const char* q) { assert(p); assert(q); char* ret (char*)p; char* p_cur NULL; char* q_cur NULL; while (*ret) { p_cur ret; q_cur (char*)q; while (*p_cur ! \0 *q_cur ! \0 *p_cur *q_cur) { p_cur; q_cur; } if (*q_cur \0) { return ret; } ret; } return NULL; } int main() { char str1[] Returns a pointer to the first occurrence of str2 in str1; char* str2 first; char* str3; str3my_strstr(str1, str2); printf(%s, str3); return 0; }8.strncpy函数使用和模拟实现作用拷贝num个字符从源字符串到目标空间。如果源字符串的长度小于num则考贝完源字符串之后在目标的后边追加0直到num个。int main() { char str1[] abc def; char str2[] jkl; strncpy(str1, str2, strlen(str2)); printf(%s\n, str1); //jkl def return 0; }模拟实现char* my_strncpy(char* destination, const char* source, size_t num) { int i 0; assert(source); assert(destination); char* p destination; while (i (int)num *source) { *destination *source; destination; source; i; } *destination \0; return p; } int main() { char str1[100]; //char* str2 abcdef hijkl mnopq; char* str2 abcd; my_strncpy(str1, str2, 12); printf(%s, str1); return 0; }9.strncat函数使用和模拟实现作用将source指向字符串的前num个字符追加到destination指向的字符串末尾再追加⼀个 \0字符。如果source 指向的字符串的长度小于num的时候只会将字符串中到\0的内容追加到destination指向的字符串末尾int main() { char str1[20]; char str2[20]; strcpy(str1, To be ); strcpy(str2, or not to be); strncat(str1, str2, 6); printf(%s\n, str1); //To be or not return 0; }模拟实现char* my_strncat(char* p, const char* q, int num) { assert(p); assert(q); char* pcur p; while (*pcur) { pcur; } int i 0; while (i num *q) { *pcur *q; i; } *pcur \0; return p; } int main() { char str1[20] abcde ; char* str2 fgh ii jkl mn; my_strncat(str1, str2, 6); printf(%s, str1); return 0; }10.strncmp函数使用和模拟实现作用比较str1和str2的前num个字符如果相等就继续往后比较最多比较num个字⺟如果提前发现不⼀样就提前结束大的字符所在的字符串大于另外⼀个。如果num个字符都相等就是相等返回0.int main() { char str1[] abcdef; char str2[] abcdef; char str3[] abd; int ret1 strncmp(str1, str2,3); //ret10 int ret2 strncmp(str1, str3,3); //ret20 return 0; }模拟实现int my_strncmp(const char* str1, const char* str2, size_t num) { assert(str1 str2); while (num 0 *str1 ! \0 *str2 ! \0 *str1 *str2) { str1; str2; num--; } if (num 0) { return 0; // 前num个字符全相等 } return *str1 - *str2; } int main() { char* s1 abcdef; char* s2 abcxyz; printf(%d\n, my_strncmp(s1, s2, 3)); //0 printf(%d\n, my_strncmp(s1, s2, 4)); //0 return 0; }