字符+字符串函数 一

简介: 字符+字符串函数

目录

求字符串长度
strlen
长度不受限制的字符串函数
strcpy
strcat
strcmp
长度受限制的字符串函数
strncpy
strncat
strncmp
字符串查找
strstr
strtok
错误信息报告
strerror
内存操作函数
C语言中对字符和字符串的处理很频繁,但是由于C语言本身是没有字符串类型,
字符串类型通常放在**常量字符串**或者**字符数组**中


函数介绍


求字符串长度


strlen


1. 字符串中存在‘\0'作为结束标志,strlen函数返回的是在字符串中'\0'
 前面出现的字符个数(不包含'\0')
 2.参数指向的字符串必须以'\0'作为结束标志
 3.注意函数的返回值为size_t,是无符号的


strlen函数的模拟实现

#include<stdio.h>
int main()
{
  char arr[] = "hello crush";
  int ret = my_strlen(arr);
  printf("%d\n", ret);
  return 0;
}

方法1:计数器方式

size_t my_strlen(char* str)
{
  int count = 0;
  while (*str)
  {
    count++;
    str++;
  }
  return count;
}

方法2:不创建临时变量的计数器->递归

size_t my_strlen(char* str)
{
  if (*str == '\0')
  {
    return 0;
  }
  else
  {
    return 1 + my_strlen(str + 1);
  }
}

方法3:指针-指针

指针-指针计算结果是中间元素的个数

size_t my_strlen(char* str)
{
  char* p = str;
  while (*str)
  {
    str++;
  }
  return str - p;
}

bca4f502e2c10e7e3e9a6fbbfe2a5737_4bb7ea47354841a88657399d99c59d0f.png


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


strcpy-字符串拷贝


1. 将源字符串复制到目标空间中(包含'\0')
 2. 源字符串必须以'\0'作为结束标志
 3. 目标空间必须足够大,以确保能存放源字符串
 4. 目标空间必须足够大


模拟实现strcpy

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*dest++ = *src++)
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[] = "hello crush";
  char arr2[20] = "xxxxxxxxxxxxxxxxx";
  char* ret = my_strcpy(arr2, arr1);
  printf("%s\n", arr2);
  return 0;
}

43fbf893e5bda3521babbbbd2a852631_3f99a88927dd41d0a0202d17cbcb7682.png


strcat-字符串追加


1. 将源字符串追加到目标字符串中,目标字符串中的终止字符被源字符串
 的第一个字符覆盖。
 2.源字符串必须以'\0'作为结束标志
 3.目标空间必须足够大,能够容纳源字符串的内容
 4.目标空间必须可修改


模拟实现strcat

1.找到目标字符串结尾的'\0'
2.拷贝—strcpy
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
  assert(dest && src);
  char* ret = dest;
  //1.找到目标字符串结尾的'\0'
  while (*dest)
  {
    dest++;
  }
  //模拟strcpy函数
  //2.拷贝—strcpy
  while (*dest++ = *src++)
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "hello ";
  char arr2[] = "crush";
  char* ret = my_strcat(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}

df0465dc58d59019a844e9101d1d9b31_28a8c775f8604449877ccf1cd5d796f4.png


strcmp-字符串比较


1.函数开始比较每个字符串的第一个字符,如果它们彼此相等,
则继续执行以下对,直到字符不同或到达终止空字符为止。
2.标准规定
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

模拟实现strcmp

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);
  while (*str1 == *str2)
  {
    if (*str1 == '\0')
    {
      return 0;
    }
    str1++;
    str2++;
  }
  return *str1 - *str2;
}
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "abcdef";
  int ret = my_strcmp(arr1, arr2);
  if (ret == 0)
  {
    printf("arr1==arr2");
  }
  else if (ret < 0)
  {
    printf("arr1<arr2");
  }
  else
  {
    printf("arr1>arr2");
  }
  return 0;
}

ee67412e9559f402a43d309f3e9daafc_e25cd44c4f064142a248a71e27c75fd1.png


长度受限制的字符串函数


strncpy-长度受限的字符串拷贝


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


代码演示

#include<stdio.h>
int main()
{
  char ch1[] = "hello";
  char ch2[10] = "*********";
  strncpy(ch2, ch1, 8);
  printf("%s\n", ch2);
  return 0;
}

c55be496e82a4afa0a0a193024f1749d_558c2ea3373843f78b7a3b1844a8bf81.png


strncat-长度受限的字符串追加


1.将源字符串的第num个字符追加到目标空间中,再加上'\0'作为终止
2.如果源字符串的长度小于num,则只追加到包括'\0'的内容


#include<stdio.h>
#include<string.h>
int main()
{
  char ch1[20] = "hello\0********";
  char ch2[] = "crushabcdef";
  strncat(ch1, ch2, 5);
  return 0;
}

db4edad7087cdc3be6489c03d22bef94_227748d0a006400e9da6a9adf4afbc9e.png


strncmp-长度受限的字符串比较



1.将字符串str1中最多num个字符与字符串str2中的最多num个字符进行比较。
2.开始比较每个字符串的第一个字符,如果它们彼此相等,它将继续执行以下对,
直到字符不同,直到到达终止空字符。或者直到num个字符在两个字符串中匹配(以先发生者为准)。


字符串查找


strstr


返回指向str2在str1中的第一次出现的指针,
如果str2不属于str1,则返回空指针


模拟实现strstr

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
  assert(str1 && str2);
  //const修饰的变量一般不进行修改
  //创建临时变量s1,s2
  const char* s1 = str1;
  const char* s2 = str2;
  char* p = s1;
  while (*p)
  {
    s2 = str2;
    s1 = p;
    while (*s1 == *s2 && *s1 != '\0' && *s1 != '\0')
    {
      s1++;
      s2++;
    }
    if (*s2 == '\0')
    {
      return p;
    }
    p++;
  }
  return NULL;
}
int main()
{
  char arr1[] = "abbcdef";
  char arr2[] = "bcd";
  char* ret = my_strstr(arr1, arr2);
  if (ret == NULL)
  {
    printf("字串不存在\n");
  }
  else
  {
    printf("%s\n", ret);
  }
  return 0;
}

目录
相关文章
|
12天前
|
Java Perl
正则表达式
正则表达式
9 0
|
5月前
|
索引 Python
正则表达式详解
正则表达式详解
|
前端开发 JavaScript Java
正则表达式(极其适合零基础)
正则表达式(极其适合零基础)
153 0
正则表达式(极其适合零基础)
|
人工智能 数据安全/隐私保护
一些常用的正则表达式
今天在写一些输入验证的时候用到了正则表达式,现在就回顾一下我们常用的正则表达式,对于正则表达式的写法很多种,看个人的习惯了,我的写法也许不是很好,但可以满足基本需求。
105 0
|
移动开发 Unix Linux
|
自然语言处理 JavaScript 前端开发
常用正则表达式
常用正则表达式
128 0
|
机器学习/深度学习 JavaScript
详解 正则表达式
详解 正则表达式
详解 正则表达式
第177天:常用正则表达式(最全)
常用正则表达式 1 2 /* 常用正则表达式大全!(例如:匹配中文、匹配html) 3 4 匹配中文字符的正则表达式: [u4e00-u9fa5] 5 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 6 匹配双字节字符(包括汉字在内):[^x0...
1121 0
|
JavaScript 前端开发 索引