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

C语言字符函数和字符串函数

文章目录

    • 字符分类函数
    • 字符转换函数
    • strlen的使⽤和模拟实现
    • strcpy的使⽤和模拟实现
    • strcat的使⽤和模拟实现
    • strcmp的使⽤和模拟实现
    • strncpy函数
    • strncat函数
    • strncmp函数
    • strstr的使⽤
    • strtok函数的使⽤

字符分类函数

C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h
在这里插入图片描述
演示其中一个代码,其他都大同小异。

#include<stdio.h>
#include<ctype.h>
int main()
{char str[]="HeLLo wOrld";int i=0;while(str[i]!='\0'){char ch=str[i];if(islower(ch)){str[i]-=32;}i++;}printf("%s",str);return 0;
}

islower 是能够判断参数部分的 ch 是否是⼩写字⺟的。通过返回值来说明是否是⼩写字⺟,如果是⼩写字⺟就返回⾮0的整数,如果不是⼩写字⺟,则返回0。

字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写  
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
#include<stdio.h>
#include<ctype.h>
int main()
{char str[]="HeLLo wOrld";int i=0;while(str[i]!='\0'){char ch=str[i];if(islower(ch)){str[i]=toupper(ch);将参数传进去的⼩写字⺟转⼤写}i++;}printf("%s",str);return 0;
}

strlen的使⽤和模拟实现

size_t strlen ( const char * str );字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。注意函数的返回值为size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件<string.h>

strlen的模拟实现:

#include<stdio.h>
#include<string.h>
int my_strlen(const char * str)
{int count = 0;assert(str);while(*str){count++;str++;}return count;
}
int main()
{char str[]="HeLLo wOrld";int ret=my_strlen(str);printf("%d",ret);return 0;
}

strcpy的使⽤和模拟实现

char* strcpy(char * destination, const char * source );

源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。
⽬标空间必须⾜够⼤,以确保能存放源字符串。
⽬标空间必须可修改

#include<stdio.h>
#include<string.h>
#include <stdio.h>
// 自定义strcpy函数
void my_strcpy(char *dest, const char *src) {while ((*dest++ = *src++) != '\0');
}
int main() {char src[] = "Hello, World!";char dest[20]; // 确保有足够的空间来存储复制的字符串my_strcpy(dest, src);printf("复制的字符串: %s\n", dest);return 0;
}

strcat的使⽤和模拟实现

源字符串必须以 ‘\0’ 结束。
⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。

void my_strcat(char *dest, const char *src) {while (*dest) {dest++; // 移动dest指针直到其指向的字符为'\0'}while (*src) {*dest = *src; // 复制src中的字符到destdest++;src++;}*dest = '\0'; // 添加字符串终止符
}int main() {char dest[50] = "Hello, ";char src[] = "World!";my_strcat(dest, src); // 将src追加到dest的末尾printf("%s\n", dest); // 输出: Hello, World!return 0;
}

strcmp的使⽤和模拟实现

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字。
第⼀个字符串等于第⼆个字符串,则返回0。
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

int my_strcmp(const char *str1, const char *str2) {while (*str1 && (*str1 == *str2)) {str1++;str2++;}return *str1 - *str2;
}int main() {char str1[] = "Hello";char str2[] = "Hello, World!";char str3[] = "hello";printf("Comparing str1 and str2: %d\n", my_strcmp(str1, str2)); // 输出: -44printf("Comparing str1 and str3: %d\n", my_strcmp(str1, str3)); // 输出: -32return 0;
}

strncpy函数

拷⻉num个字符从源字符串到⽬标空间。
如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加’\0’,直到num个

#include <stdio.h>
char *my_strncpy(char *dest, const char *src, size_t n) {char *dest_start = dest;// 复制src到dest,直到遇到空字符或者复制了n个字符while (n-- && (*dest++ = *src++));// 如果n不为0,说明还没有遇到空字符,需要手动添加空字符if (n != 0) {*dest = '\0';}return dest_start;
}int main() {char src[] = "Hello World";char dest[20];my_strncpy(dest, src, 8); // 复制8个字符,包括空字符printf("Copied string: %s\n", dest);return 0;
}

strncat函数

char * strncat ( char * destination, const char * source, size_t num );> 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字符
如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾
#include <stdio.h>
char *my_strncat(char *dest, const char *src, size_t n) {char *dest_end = dest;// 找到目标字符串dest的末尾while (*dest_end) {dest_end++;}// 将源字符串src追加到目标字符串dest的末尾while (n-- && *src) {*dest_end++ = *src++;}// 添加空字符以结束字符串*dest_end = '\0';return dest;
}int main() {char dest[20] = "Hello";char src[] = " World";my_strncat(dest, src, 6); // 追加6个字符,包括空字符printf("Concatenated string: %s\n", dest);return 0;
}

strncmp函数

int strncmp ( const char * str1, const char * str2, size_t num );⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀
样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
#include <stdio.h>
int my_strncmp(const char *s1, const char *s2, size_t n) {unsigned char u1, u2;// 比较两个字符串的前n个字符while (n-- != 0 && *s1 != '\0' && *s1 == *s2) {s1++;s2++;}// 如果n为0,或者两个字符串在比较过程中完全相同,则返回0if (n == 0) {return 0;}// 将字符转换为unsigned char,以避免负值的比较u1 = (unsigned char)*s1;u2 = (unsigned char)*s2;return (u1 > u2) ? 1 : (u1 < u2) ? -1 : 0;
}
int main() {char str1[] = "Hello World";char str2[] = "Hello hello";int result = my_strncmp(str1, str2, 9); // 比较前9个字符printf("Comparison result: %d\n", result);return 0;
}

strstr的使⽤

char * strstr ( const char * str1, const char * str2)

函数返回字符串str2在字符串str1中第⼀次出现的位置
字符串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志

char* my_strstr (const char * str1, const char * str2)
{char *cp = (char *) str1;char *s1, *s2;if ( !*str2 )return((char *)str1);while (*cp){s1 = cp;s2 = (char *) str2;while ( *s1 && *s2 && !(*s1-*s2) )s1++, s2++;if (!*s2)return(cp);cp++;}return(NULL);
}
int main()
{const char str1[]="Hello world";const char str2[]="world";char* found=my_strstr(str1,str2);printf("%s",found);return 0;
}

strtok函数的使⽤

char * strtok ( char * str, const char * sep);> sep参数指向⼀个字符串,定义了⽤作分隔符的字符集合第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的记。
strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷⻉的内容
并且可修改。)
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "192.168.6.111";char* sep = ".";char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}

完。


http://www.mrgr.cn/news/58040.html

相关文章:

  • MongoDB安装配置及配置和启动服务
  • Python poetry 虚拟环境
  • 跟着工作簿学 Tableau(39):解锁 20 种 KPI 可视化模板(下篇)
  • esxi中扩展lvm磁盘大小
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
  • 《工业领域缺陷检测方案:创新与应用》
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。(AI)
  • JavaSE——IO流7:其他流
  • 深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
  • JWT加密解密
  • 【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
  • 深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
  • opencv深度学习:面部特征点匹配与图像融合--换脸
  • 二、Python的五种容器和函数(有C语言基础速成版)
  • 异次元v4.0
  • [MySQL#1] database概述 | 常见的操作指令 | MySQL架构 | 存储引擎
  • 使用微信小程序实现登录
  • 【 thinkphp8 】00008 thinkphp8数据查询,常用table,name方法,进行数据查询汇总
  • 大话红黑树之(2)源码讲解TreeMap-Java
  • 基于Java的高校毕业生就业信息管理系统
  • DAY16
  • N-gram 详解
  • 【1024程序员节】:希望再无BUG
  • html小游戏-飞机大战
  • C++之模板进阶
  • 洞察前沿趋势!2024深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛技术公开课指南