当前位置: 首页 > news >正文

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;
}

         结果图:

http://www.xdnf.cn/news/610831.html

相关文章:

  • 深入浅出 Python Testcontainers:用容器优雅地编写集成测试
  • Java详解LeetCode 热题 100(20):LeetCode 48. 旋转图像(Rotate Image)详解
  • 皮尔森电流互感器在浪涌电流测试中的应用
  • 如果教材这样讲---开关电源的拓扑结构
  • 路由协议RIP配置与分析
  • 现代软件开发利器
  • C++成员对象和封闭类
  • 【鼎的3D设计与AI提示词方案】
  • echarts之双折线渐变图
  • 独木桥 Java
  • 基于SpringBoot+Vue的社区医院信息平台设计与实现
  • 软考中级软件设计师——计算机系统篇
  • STM32+腾讯物联网平台OTA升级详细教程
  • 华为OD机试_2025 B卷_爱吃蟠桃的孙悟空(Python,100分)(附详细解题思路)
  • 从逆流监测到智慧用电:ADL200N-CT系列单相导轨表赋能家庭绿色能源
  • ubuntu设置开机不输密码笔记
  • 解决Vue项目依赖错误:使用electron-vite重建
  • 提升开发运维效率:原力棱镜游戏公司的 Amazon Q Developer CLI 实践
  • 使用clickhouse的ReplacingMergeTree引擎表做活跃玩家信息表
  • Unity 打包程序全屏置顶无边框
  • 宽松相等(==) 的转换规则(仅考虑基本数据类型)
  • 怎么判断一个Android APP使用了Ionic这个跨端框架
  • 智能交通红绿灯系统(Python)
  • TCP 三次握手,第二次握手报文丢失会发生什么?
  • IP隧道技术中数据包头部的变化分析:必然增加的封装机制
  • (15)关于窗体的右键菜单的学习与使用,这关系到了信号与事件 event
  • 特殊的完全平方数
  • 【MySQL】 数据库基础数据类型
  • 【c++】: c++11线程库
  • 【Hexo】3.主题