【C语言】字符串函数及其模拟实现

简介: 【C语言】字符串函数及其模拟实现

前言

字符是C语言中整形家族的一大特殊群体,其本质是ASCII码值进行转换的,其相关的常见库函数会在编写代码时提供一些便利,下面来简单看一下:


1.字符分类函数

字符分类函数,是对于全体字符进行分类的。

我们以isdigit函数语法为例,其他都是基本相同的

2.字符转换函数

常用的两个字符转换函数:

3.strlen求字符串长度函数

3.1strlen函数的使用(头文件:<string.h>)

#include<stdio.h>
#include<string.h>
//strlen函数返回值是size_t容易误用
int main()
{
  if (strlen("abc") - strlen("abcdef") > 0)//易错:3-6=?
    printf("surprise\n");
  else
    printf("normal\n");
  return 0;
}

3.2strlen函数的模拟实现

strlen函数实现有多种方式,下面简单介绍几种思路:

//strlen函数的模拟实现
size_t my_strlen1(char* str)
{
  size_t count = 0;
  while (*str++)
  {
    count++;
  }
  return count;
}
size_t my_strlen2(char* str)
{
  char* start = str;
  while (*str++)
  {
    ;
  }
  return str - start - 1;
}
size_t my_strlen3(char* str)
{
  if (!*str)
  {
    return 0;
  }
  else
    return 1 + my_strlen3(++str);
}
int main()
{
  char str[] = "abcdef";
  size_t result1 = my_strlen1(str);
  size_t result2 = my_strlen2(str);
  size_t result3 = my_strlen3(str);
  printf("result of way1 = %zd\n", result1);
  printf("result of way2 = %zd\n", result2);
  printf("result of way3 = %zd\n", result3);
  return 0;
}

4.strcpy字符串拷贝函数

4.1strcpy函数的使用

功能:strcpy是将source字符串中的内容拷贝到destion中去,包括\0

返回值说明:如果拷贝成功,返回destion的地址;如果拷贝失败,返回NULL;

4.2strcpy函数的模拟实现

//strcpy函数的模拟实现
char* my_syrcpy(char* des, const char* src)
{
  char* start = des;
  while (*des++ = *src++)
  {
    ;
  }
  return start;
}
int main()
{
  char des[100] = {0};
  char src[] = "hello the world";
  //char* result1 = strcpy(des,src);
  char* result2 = my_syrcpy(des,src);
  //printf("result of library function is: %s\n", result1);
  printf("result of custom function  is: %s\n", result2);
  return 0;
}

5.strcat函数

5.1strcat函数的使用

功能:将source中的字符串追加到destion中字符串的后面去。

返回值说明:如果追加成功,返回destion的地址;如果拷贝失败,返回NULL;

5.2strcat函数的模拟实现

//strcat函数的模拟实现
char* my_strcat(char* str,const char* src)
{
  char* start = str;
  while (*str++)
  {
    ;
  }
  str--;
  while (*str++ = *src++)
  {
    ;
  }
  return start;
}
int main()
{
  char str[100] = "hello ";
  char src[] = "the world";
  //char* result1 = strcat(str,src);
  char* result2 = my_strcat(str, src);
  //printf("result1 of library function is : %s\n", result1);
  printf("result2 of custom function is : %s\n", result2);
  return 0;
}

6.strcmp字符串比较函数

6.1strcmp函数的使用

6.2strcmp函数的模拟实现

//strcmp函数的模拟实现
int my_strcmp(char* str1, char* str2)
{
  while (*str1 == *str2)
  {
    if (*str1 == '\0')
    {
      return 0;
    }
    str1++;
    str2++;
  }
  if (*str1 > *str2)
    return 1;
  else
    return -1;
}
int main()
{
  char str1[] = "abcdef";
  char str2[] = "abcq";
  int result = my_strcmp(str1,str2);
  if (result > 0)
    printf("str1 > str2\n");
  else if (result < 0)
    printf("str1 < str2\n");
  else
    printf("str1 = str2\n");
  return 0;
}

7.strncpy,strncat,strncmp函数

7.1strncpy,strncat,strncmp

strncpy,strncat,strncmp这三个函数基本与strcpy,strcat,strcmp函数语法基本是一致的,不过多了个参数,用来控制拷贝几个,追加几个,比较几个字符,相对strcpy,strcat,strcmp函数而言更加安全一些。这里不多赘述。

我们举一个例子说明这三个的基本语法:

7.2strcpy,strcat,strcmp与strncpy,strncat,strncmp的区别?

7.2.1strncpy函数

stencpy拷贝不会刻意加上\0,把原函数全部拷贝了如果还达不到程序员设置最大字符限制,补\0

7.2.1strncat函数

追加完字符串后,会主动追加一个\0,保证目标字符串是一个字符串。也就是说,他会追加n-1个字符还有1个’\0’。

不会超过原字符串的长度去追加。

7.3strncmp函数

这个就是限制了比较的长度而已,目前没发现什么区别。

8.strstr函数

8.1strstr函数的使用

strstr函数是干什么的?

功能:strstr函数是用来在一个字符串中找另一个字符串的第一次出现的地址的。

strstr函数的使用代码一览:

int main()
{
  char destion[] = "abcabbbbcd";
  char source[] = "bcd";
  char* result1 = strstr(destion, source);
  //char* result2 = my_strstr(destion, source);
  printf("the result of standard library is : %s", result1);
  //printf("the result of myself way is : %s", result2);
  return 0;
}

8.2strstr函数的模拟实现

char* my_strstr(const char* destion,const  char* source)
{
  char* cur = destion;
  char* s1 = NULL;
  char* s2 = NULL;
  //特殊情况,直接让我找个\0,我直接给他把目标字符串的地址给他返回去
  if (*source == '\0')
  {
    return destion;
  }
  while (*cur)
  {
    s1 = cur;//每次cur变化时候,把s1初始化为cur开始的地方
    s2 = source;//每次cur变化的时候,把s2初始化为source开始的地方
    while (*s1 && *s2 && *s1 == *s2)
    {
      s1++;
      s2++;
    }
    if (*s2 == '\0')
    {
      return cur;
    }
    
    cur++;
  }
  return NULL;
  
}
int main()
{
  char destion[] = "abcabbbbcd";
  char source[] = "bcd";
  //char* result1 = strstr(destion, source);
  char* result2 = my_strstr(destion, source);
  //printf("the result of standard library is : %s", result1);
  printf("the result of myself way is : %s", result2);
  return 0;
}

9.strtok函数

9.1strtok函数的基本语法

首先第一个问题哈,strtok函数是干啥的?下面来揭示strtok函数的基本语法规则:

9.2strtok函数的使用(代码)

//strtok函数的使用
int main()
{
  char str1[] = "zhangsan/163@qq.com";
  char str2[] = "/@.";
  char* s1 = strtok(str1, str2);
  printf("%s\n", s1);
  s1 = strtok(NULL, str2);
  printf("%s\n", s1);
  s1 = strtok(NULL, str2);
  printf("%s\n", s1);
  s1 = strtok(NULL, str2);
  printf("%s\n", s1);
  return 0;
}

代码结果:

这样显然是可以使用strtok函数的,不过需要调用四次,是比较麻烦的,一般我们可以结合for循环进行使用:

//strtok函数结合for循环使用:
int main()
{
  char str1[] = "zhangsan/163@qq.com";
  char str2[] = "/@.";
  char* p = NULL;
  for (p = strtok(str1, str2); p != NULL; p = strtok(NULL, str2))
  {
    printf("%s\n", p);
  }
  return 0;
}

10.strerror与str

10.1strerror

10.1.1strerror函数的基本语法规则:

10.1.2sterror函数的使用(代码):

int main()
{
  int i = 0;
  for (i = 0; i <= 10; i++)
  {
    printf("the %d error is :%s\n",i, strerror(i));
  }
  return 0;
}

其结果为:

这是0到10错误码翻译对应的信息。

一般我们是这样用的:

#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));
  return 0;
}

10.2perror函数

10.2.1perror函数的基本语法(头文件:stdio.h)

相对于strerror函数来说,更加直接

10.2.2perror函数的使用举例

#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 of strerror: %s\n", strerror(errno));
    perror("Error opening file unexist.ent of perror");
  }
  return 0;
}

总结:

字符串函数是我们C语言常用的针对字符串操作的函数,有利于加深对字符串的理解。

感谢您阅读本文。如果您有任何问题或需要进一步了解,请随时联系我。祝您一切顺利!

相关文章
|
23天前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
23天前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
2月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
31 0
【C语言】字符函数,字符串函数,内存函数
|
3月前
|
C语言
【c语言】字符串函数的模拟实现(二)
【c语言】字符串函数的模拟实现(二)
18 1
|
3月前
|
C语言
【C语言】:10大字符串函数
【C语言】:10大字符串函数
19 1
|
3月前
|
编译器 C语言 C++
【C语言基础】:字符函数和字符串函数-2
【C语言基础】:字符函数和字符串函数
|
3月前
|
C语言
【C语言基础】:字符串函数(二)
【C语言基础】:字符串函数(二)
|
3月前
|
C语言
【C语言基础】:字符函数和字符串函数-1
【C语言基础】:字符函数和字符串函数
|
3月前
|
C语言
【C语言】【字符串函数】【超详解】【上】!!!
【C语言】【字符串函数】【超详解】【上】!!!
24 3
|
3月前
|
安全 编译器 C语言
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
C语言学习记录——字符串相关函数及部分模拟(strcmp、strncmp、strncat、strncpy、strstr、strtok、strerror)
28 1