c语言字符串函数
一、strlen()函数:
strlen(字符数组)——测字符串长度的函数
作用是测试字符串长度的函数,函数的值为字符串实际的长度(不包括 '\0' 在内)。
gets():gets(字符数组)——输入字符串的函数(注意:gets函数在C11标准中已被移除,建议使用fgets)
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入字符串gets(str);//字符串长度int len = strlen(str);printf("字符串长度为:%d\n", len);return 0;
}
结果图:
2、函数原型:
int strlen(const char *str)
3、代码实现
#include <stdio.h>
//计数法
int my_strlen(const char *str) {//长度计算int len = 0;while(*str != '\0'){len++;str++;}return len;
}
//递归法
int my_strlen(const char *str) {if (*str == '\0'){return 0;}else{return my_strlen(str + 1) + 1;}}
二、 strcat():追加部分字符串
strcat(字符数组1,字符数组2)——字符串连接的函数
作用是把两个字符数组中的字符串连接起来,把字符串2连接到字符串1的后面,结果放在字符数组1中
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入字符串gets(str);char str1[20] = "苏沐橙";//字符串拼接函数char *p = strcat(str,str1);//输出拼接后的字符串/输出到端口puts(p);return 0;
}
2、函数原型:
char *strcat(char *dest, const char *src)
3、 原型代码:
#include <stdio.h>
#include <assert.h> //判断字符串是否为空
char *my_strcat(char *dest, const char * src){assert(dest && src);//保存dest的原始位置char *my_dest = dest;while (*dest != '\0'){dest++;}while(*dest++ = *src++);return my_dest;
}
结果图:
三、strstr():
其形式为:strstr(字符串1,字符串2)——查找字符串的函数
作用:函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入字符串gets(str);char str1[20] = "bc";//查找字符串:char *p = strstr(str,str1);if (p == NULL){printf("字符串%s不在字符串%s中\n",str1,str);}else{//端口输出字符串puts(p); }return 0;
}
2、函数原型:
char* my_strstr(const char *str, const char *sub)
3、原型代码:
#include <stdio.h>
char* my_strstr(const char *str, const char *sub){const char* p1;const char* p2;const char* r;if (*sub == '\0'){// 如果要查找的子字符串为空,返回主字符串的起始位置return (char*)str;}for (p1 = str; *p1 != '\0'; p1++){r = p1; // 记录当前比较的起始位置p2 = sub; // 子字符串指针while(*p1 == *p2 && *p1 != '\0' && *p2 != '\0'){p1++;p2++;}if (*p2 == '\0'){// 如果子字符串比较完毕,则找到了匹配,返回起始位置return (char*)r;}// 如果未找到匹配,重置p1到上次比较的起始位置p1 = r;}// 如果未找到子字符串,返回NULLreturn NULL;
}
结果图:
四、strcmp()/strncmp():
其形式为:strcmp(字符数组1,字符串2)——字符串比较的函数(字符串不能用等号来比较大小)
作用:如果字符串1与字符串2相同,则函数值为0/如果字符串1 > 字符串2,则函数值返回一个正数/如果字符串1 < 字符串2,则函数值返回一个负数。
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入字符串 /// 注意:gets函数在C11标准中已被移除,建议使用fgetsfgets(str,sizeof(str),stdin);//去除输入字符串末尾的换行符,如果有的话str[strcspn(str,"\n")] = '\0';char str1[20] = "苏沐橙love你";//字符串复制函数// 使用 int 类型存储 strcmp 的返回值int p = strcmp(str,str1);printf("strcmp:%d\n",p);//字符串strncmp(): 字符串前n个字符比较函数int cmpy = strncmp(str,str1,2);printf("strncmp:%d\n",cmpy);return 0;
}
2、函数原型:
int my_strcmp(const char *str1, const char *str2) int my_strncmp(char *str1, char *str2,int n)
3、代码原型:
int my_strcmp(char *str1, char *str2){while(*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}
int my_strncmp(char *str1, char *str2,int n){while ((n-- > 0) && (*str1 == *str2)){*str1++;*str2++;}//return *str1 - *str2;return (*(unsigned char *)str1 - *(unsigned char *)str2);
}
五、strcpy():拷贝函数:strcpy(字符数组1,字符串2)——字符串复制的函数(拷贝字符串,遇到\n结束)
作用是将字符串2复制到字符数组1中去
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入字符串 /// 注意:gets函数在C11标准中已被移除,建议使用fgetsfgets(str,sizeof(str),stdin);//去除输入字符串末尾的换行符,如果有的话str[strcspn(str,"\n")] = '\0';char str1[20] = "苏沐橙";//拷贝字符串,遇到空格停止拷贝strcpy(str,str1);printf("拷贝后的字符串:%s\n",str);printf("fputs输出:");//端口输出fputs(str,stdout);printf("\n");return 0;
}
2、函数原型 :
char* my_strcpy(char* dest, const char* src)
3、代码原型:
char * my_strcpy(char *dest, const char *src){assert(dest && src);// 保存原始目标字符串的起始位置char * p = dest;while (*src){*dest++ = *src++;}// 确保目标字符串以 null 终止符结束dest = '\0';// 返回正确的指针位置return p;
}
结果图:
六、strncpy() 拷贝函数:跟strcpy()一样多一个n:拷贝几个
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");// 端口输入字符串 /// 注意:gets函数在C11标准中已被移除,建议使用fgetsfgets(str, sizeof(str), stdin);// 去除输入字符串末尾的换行符,如果有的话str[strcspn(str, "\n")] = '\0';char str1[20] = "苏沐橙";// 拷贝2个字符,并手动添加空终止符strncpy(str, str1, 2);str[2] = '\0'; // 手动在 str[2] 处添加空终止符printf("拷贝2个字符串:%s\n", str);printf("fgets输出:");// 使用 stdout 作为输出流fputs(str, stdout);printf("\n");return 0;
}
2、函数原型:
char *my_strncpy(char *dest, const char *src, size_t n);
3、代码原型:
char *my_strncpy(char *dest, const char *src, int n){assert(dest && src);char *p = dest;while(n--){*dest++ = *src++;}// 确保目标字符串以 null 终止符结束dest = '\0';// 返回正确的指针位置return p;}
结果图:
七、strtok():分割字符串|用于分割一个字符串为多个子字符串,通常用于解析文本数据。
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("请输入字符串:\n");//端口输入fgets(str,sizeof(str),stdin);//str添加'\0'结束符str[strcspn(str,"\0")] = '\0';strtok(str,"你");printf("strtok:%s\n",str);printf("\n");printf("fputs:");fputs(str,stdout);return 0;
}
2、函数原型:
char *my_strtok(char *str, const char *dest)
3、代码原型:
static char *last_pos = NULL;
char *custom_strtok(char *str, const char *delim) {char *start;char *end;if (str == NULL && last_pos == NULL) { // 如果输入为空且无上次状态,则结束return NULL;}start = (str != NULL) ? str : last_pos; // 初始位置设置为当前字符串或上次保存的状态if (start == NULL || *start == '\0') { // 若初始位置为空则返回空return NULL;}// 跳过分隔符直到遇到有效字符start += strspn(start, delim);if (*start == '\0') { // 如果跳过后已经是字符串末尾,则返回空last_pos = NULL;return NULL;}// 寻找下一个分隔符的位置end = strpbrk(start, delim);if (end == NULL) { // 如果找不到分隔符,说明这是最后一个子串last_pos = NULL;} else {*end = '\0'; // 将分隔符替换为'\0'last_pos = end + 1; // 更新下次搜索的起点}return start; // 返回本次找到的子串起始地址
}
结果图:
八、strlwr()函数:
其形式为:strlwr(字符串)——转换为小写的函数
作用是将字符串中的大写字母转换成小写字母。
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("输入大小写字母:\n");//端口输入fgets(str,sizeof(str),stdin);str[strcspn(str,"\n")] = '\0';//strlwr()函数:大写转小写strlwr(str);printf("小写字母:%s\n",str);fputs(str,stdout);return 0;
}
2、函数原型:
char *my_strlwr(char *str);
3、代码原型:
// 定义宏,将大写字母转换为小写字母
#define _TOLOWER(c) ((c >= 'A' && c <= 'Z') ? (c -'A' + 'a') : c)char *my_strlwr(char *str){//检查输入是否为空if (str == NULL){return NULL;}char *p = str;// 遍历字符串,将大写字母转换为小写字母while(*p != '\0'){if (*p >= 'A' && *p <= 'Z') // 如果是大写字母{*p = _TOLOWER(*p); // 转换为小写字母}// 指针后移p++;}// 返回转换后的字符串return str;
}
结果图:
九、strupr()函数:
其形式为:strupr(字符串)——转换为大写的函数
作用是将字符串中的小写字母转换成大写字母。
1、代码测试:
#include <stdio.h>
#include <string.h>int main() {char str[20];printf("输入大小写字母:\n");//端口输入fgets(str,sizeof(str),stdin);str[strcspn(str,"\n")] = '\0';//strlwr()函数:小写转大写strupr(str);printf("小写转大写:%s\n",str);fputs(str,stdout);return 0;
}
2、函数原型:
char *my_strupr(char *str);
3、代码原型:
#include <stdio.h>
#include <string.h>
#include <assert.h> // 判断字符串是否为空
#include <ctype.h> // 判断字符是否为字母// 定义宏,将小写字母转换为大写字母
#define _TOUPPER(c) ((c >= 'a' && c <= 'z') ? (c - 'a' + 'A') : c)char *my_struper(char *str) {// 字符串为空,返回空指针if (str == NULL) {return NULL;}char *p = str;// 遍历字符串,将小写字母转换为大写字母while (*p != '\0') {if (*p >= 'a' && *p <= 'z') {*p = _TOUPPER(*p);}p++; // 确保指针后移}return str;
}
结果图: