C语言—常用字符串函数剖析

字符串函数

cplusplus.com/reference/cstring/

更多没有总结到的函数大家可以自行查阅

这篇文章只是把最需要知道的函数做一个总结

image-20240418131842872

strlen

size_t strlen ( const char * str );
  • 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的
  • 学会strlen函数的模拟实现
#include <stdio.h>
int main()
{
 const char*str1 = "abcdef";
 const char*str2 = "bbb";
 if(strlen(str2)-strlen(str1)>0)
 {
 printf("str2>str1\n");
 } 
 else
 {
 printf("srt1>str2\n");
 }
 return 0;
}

大家思考一下,这个程序的运行结果是什么?

因为返回的是无符号整型,那么怎么能出来负数呢?

一定要会模拟这个函数

int my_strlen(const char * str)
{
 int count = 0;
 while(*str)//"\0"即为0,假
 {
 count++;
 str++;
 }
 return count;
}

strcpy

image-20240417230214006

char* strcpy(char * destination, const char * source );
  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。
  • 学会模拟实现。

strcat

image-20240417230559853

字符串追加

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 字符串自己给自己追加,可以吗?

当然是不可以的,字符串内容被修改,无法找到\0,程序会死循环

strcmp

image-20240417231046161

int strcmp ( const char * str1, const char * str2 );

标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

长度受限制字符串函数

  • 相对更加安全
  • strncpy
  • strncat
  • strncmp

可以减小我们程序出现问题的可能,大家有兴趣可以下去查一下

这些函数我们最好也尝试自己去实现

strncpy

cplusplus.com/reference/cstring/strncpy/

strncat

cplusplus.com/reference/cstring/strncat/

strncmp

cplusplus.com/reference/cstring/strncmp/

strstr(查找子串)

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

image-20240417232005764

查找str1中是否有str2的字串

找到时返回char*指针,指向字串头指针

找不到是返回空指针

/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  strncpy (pch,"sample",6);
  puts (str);
  return 0;
} 

需要学会实现

这个函数在数据结构中好像有过讲解,以后会写文章详细讲解

strtok(字符串切割)

char * strtok ( char * str, const char * sep );

image-20240417232315504

  • str:要分割的字符串,第一次调用时传入需要分割的字符串,后续调用时传入 NULL。
  • delim:分隔符,即根据此字符集中的任何字符进行分割。

返回值

  • 如果成功找到了分割后的片段,则返回指向该片段的指针。
  • 如果找不到分隔符或者传入的字符串为空,则返回 NULL。

注意

  • 在第一次调用 strtok 时,需要传入要分割的字符串,并且在后续调用中传入 NULL。
  • strtok 函数使用静态变量来保存上一次分割的位置,因此不是线程安全的,应当避免在多线程环境下使用。
  • 分割后的片段会修改原始字符串,将分隔符替换为 NULL,因此在使用返回的片段时要注意不要修改原始字符串。
  • 如果要分割多个字符串,建议使用 strtok_r 函数,它是 strtok 的线程安全版本。

可以看一下演示

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello,world,this,is,a,test";
    char *token = strtok(str, ",");

    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, ",");
    }

    return 0;
}

以上示例将会输出:

Hello
world
this
is
a
test

这里将字符串按照逗号分割成了多个片段,并依次输出每个片段。

奇奇怪怪的函数

strerror

image-20240418124537108

这个函数就比较有意思了

 char * strerror ( int errnum );

返回错误码,所对应的错误信息。

/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{
  FILE * pFile;
  pFile = fopen ("unexist.ent","r");
  if (pFile == NULL)
    printf ("Error opening file unexist.ent: %s\n",strerror(errno));
    //errno: Last error number
  return 0;
}
Edit & Run

这个函数是什么意思呢,在C语言的函数库中,函数执行出现异常会自动返回错误码,而这个错误码会自动存储在全局变量

errno

这个变量中,这个变量是C语言自动创建的,而strerror就可以去解读这个错误码

帮我们找到程序异常发生的原因

字符分类函数:

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
islower小写字母a~z
isupper大写字母A~Z
isalpha字母az或AZ
isalnum字母或者数字,az,AZ,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符
  • isspace需要注意一下,不仅仅是空白字符,有一些转义字符也被认为是空白的

字符转换函数:

int tolower ( int c );
int toupper ( int c );
  • 大写变小写或者小写变大写
  • 如果不是字母则不动
/* isupper example */
#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 (isupper(c)) 
        c=tolower(c);
    putchar (c);
    i++;
 }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J.Pei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值