【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(上)

简介: 【C语言】字符函数和字符串函数(一)—>库函数的介绍与模拟实现(上)

前言:

本篇重点围绕字符和字符串的部分库函数展开讲解,并进行模拟实现,下一篇内容会运用本篇所学进行左旋右旋字符串的判断及实现(三步翻转法)。

一、函数介绍:

(一)求字符串长度

(1)strlen

size_t  strlen( const char* str );

该函数的作用是统计字符串中'\0'之前的字符个数(不含'\0')。

  • 参数指向的字符串必须以'\0'结束
  • 函数的返回值为无符号整型size_t。

利用strlen函数进行字符串长度比较时,要注意得到的结果是无符号整型,所以不能用相减为正负数为依据进行比较。

(二)长度不受限制的字符串函数

长度不受限制的意思是指本分类下的库函数没有设置长度限制,他们都是根据'\0'的位置来自行判断是否停止的,所以'\0'对于此类目下的库函数非常重要,所以你可以发现此类目下的库函数都要求源字符串必须以'\0'结束。

(2)strcpy

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

该函数会将source指针指向的字符串拷贝到destination指针指向的字符串中,注意包含'\0'。

  • 源字符串必须以'\0'结束。
  • 目标空间必须有足够大,确保可以容纳源字符串内容。
  • 目标空间必须可修改。
  • 返回值为目标空间的首元素地址(初始状态下destination的地址)

(3)strcat

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

该函数会将source指针指向的字符串追加到destination指针指向的字符串后面,注意包含'\0'。

  • 源字符串必须以'\0'结束。
  • 目标空间必须有足够大,确保可以容纳源字符串内容。
  • 目标空间必须可修改。

问:该函数是否可以运用到字符串自己给自己追加的情况?

当destination指针指向了'\0'时,就做好了追加的准备,下一步就是将'\0'替换为source指向的元素,并依次向后进行,直到检测到source指向'\0'时结束,但当两指针指向同一块区域时,明显source要寻找的'\0'已经被destination修改了,就导致越界出现错误。

问:那么如何利用库函数使字符串自己给自己追加呢?

我们可以利用另一个库函数strncat就可以解决这一问题,因为strncat是长度受限制的字符串函数,他停止的依据取决于参数num,而不是'\0'的位置

(4)strcmp

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

该函数会将两个字符串进行比较,比较的依据是两者第一次出现不同字符的ASCII码值,如果前者大于后者返回一个正数,反之返回一个负数,全部相等返回0。

(三)长度受限制的字符串函数

与长度不受限制的字符串函数的区别在于,该种函数需要设置需要操作的字符个数,也就是参数num,执行结束的依据取决于num,而不取决于'\0'的位置,长度受限制的字符串函数相较于长度不受限制的字符串函数相对更安全

(5)strncpy

char* strncpy( char* destination, const char* source, size_t num );

该函数的作用是拷贝num个字符从源字符串到目标空间。

  • 如果源字符串长度小于num,则拷贝完源字符串之后,在目标的后面追加'\0',直到num个。

(6)strncat

char* strncat( char* destination, const char* source, size_t num );

该函数将源字符串num个字符追加到目标字符串后,并加入结束标志'\0'。

  • strncat可以用于字符串自己给自己追加,具体解释见strcat。

(7)strncmp

int  strncmp( const char* str1, const char* str2, size_t num );

该函数的作用是比较到字符不一样或者一个字符串结束或者num个字符全部比较完,前者大于后者返回正数,反之返回负数,全部相等返回0。

(四)字符串查找

(8)strstr

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

该函数的作用是返回str2指向的字符串在str1指向的字符串中第一次出现的位置。

  • 如果str2指向的字符串不是str1指向的字符串的一部分,那么返回NULL。

(9)strtok

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

该函数用作分割字符串,简单的说就是根据分隔符的字符集合sep分割该字符串。

  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

下面给出一段代码助理解:

假设我们想要得到一个邮箱mrfanf@csdn.tech中的去掉符号后的字符串,即mrfanf、csdn、tech,我们就可以利用strtok函数,首先声明分隔符集合“@.”。

#include<stdio.h>
#include<string.h>
int main()
{
  char* p = "mrfanf@csdn.tech";
  const char* sep = "@.";
  char arr[30];
  char* str = NULL;
  strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
  for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
  {
    printf("%s\n", str);
  }
}

(五)错误信息报告

(10)strerror

char* strerror( int errnum );

该函数的作用是返回错误码errnum所对应的错误信息字符串的地址。

  • 库函数在执行时如果发生错误,会将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局变量。
  • 使用该库函数需要额外引用头文件errno.h。

应用:

#include<errno.h>
int main()
{
  //C语言中可以操作文件
  //操作文件的步骤
  //1. 打开文件
  //2. 读/写
  //3. 关闭文件
  FILE* pf = fopen("data.txt", "r");//在当前路径下,打开data.txt文件并读取
  if (pf == NULL)//打开或读取失败
  {
    printf("fopen: %s\n", strerror(errno));
    perror("fopen");
    //fopen: xxxxxx
    return 1;
  }
  //读文件
  //...
  //关闭文件
  fclose(pf);
  return 0;
}

perror("fopen");

printf("fopen: %s",strerror(errno));

以上代码效果相同(%s前有一个空格字符),perror的作用就是直接打印错误信息,""内为自定义信息,因为错误是默认已经存储的,不需要手动输入,perror自动接收。

目录
相关文章
|
10天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
25 3
|
1天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
17 10
|
5天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。
ly~
|
10天前
|
数据可视化 BI API
除了 OpenGL,还有哪些常用的图形库可以在 C 语言中使用?
除了OpenGL,C语言中还有多个常用的图形库:SDL,适合初学者,用于2D游戏和多媒体应用;Allegro,高性能,支持2D/3D图形,广泛应用于游戏开发;Cairo,矢量图形库,支持高质量图形输出,适用于数据可视化;SFML,提供简单接口,用于2D/3D游戏及多媒体应用;GTK+,开源窗口工具包,用于创建图形用户界面。这些库各有特色,适用于不同的开发需求。
ly~
22 4
|
10天前
|
C语言
C语言函数
C语言函数
10 0
|
11天前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
11天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
34 0
|
11天前
|
C语言
c语言回顾-函数递归(上)
c语言回顾-函数递归(上)
27 2