字符串函数介绍&应用(一)

简介: 字符串函数介绍&应用

1.前言


C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在

常量字符串中或者字符数组中。


字符串常量适合于那些对他不做修改的函数。


2.库函数及其模拟实现


2.1 strlen函数


size_t strlen ( const char * str );


函数要求:


  • 字符串中将’\0’ 作为结束标志,strlen函数返回的是在字符串中’\0’ 前面出现的字符个数(不包含’\0’ )。
  • 参数的指向的字符串必须要以’\0’结束,否则计算结果是随机值。
  • 要注意strlen函数的返回值是size_t,是无符号数。


函数功能:计算str指向的字符串的长度。


测试代码:


int main()
{
  char arr1[10] = "ab";
  char arr2[10] = "abc";
  if ((strlen(arr1) - strlen(arr2)) > 0)
  {
  printf("arr1更大");
  }
  else
  {
  printf("arr2更大");
  }
  return 0;
}


运行结果:


a1a449f4540d03c3ba5ba0291ede4216_f20ece717cd34daeb77bbe12a2951fbd.png


结果明显是不符合现象的。


原因:strlen函数的返回值是size_t类型的,也就是unsigned int类型,返回的数是无符号数,这里的返回值分别是2和3,他们的类型都是unsigned int,在得到运算结果-1时,也会将-1当作无符号数处理,内存中的-1存储的是补码,这个补码会被当做原码处理,所以得到的结果就会是一个很大的数。


所以要注意:strlen函数的返回值的类型是unsigned int类型的。


strlen函数的模拟实现:


//方法一
unsigned int my_strlen(char* arr)
{
  int count = 0;
  while (*arr)
  {
  count++;
  arr++;
  }
  return count;
}
int main()
{
  char arr[10] = "abcdef";
  printf("%d\n", my_strlen(arr));
  return 0;
}
//方法二
unsigned int my_strlen(char* arr)
{
  if (*arr == '\0')
  return;
  else
  return 1 + my_strlen(arr+1);
}
int main()
{
  char arr[10] = "abcdef";
  printf("%d\n", my_strlen(arr));
  return 0;
}

2.2 strcpy函数


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


函数要求:


  • 源字符串必须以 '\0'结束
  • 函数会将源字符串中的’\0’ 拷贝到目标空间
  • 目标空间必须足够大,以确保能存放源字符串
  • 目标空间必须可变


函数功能:将source指向的字符串拷贝到destination指向的字符串中。


测试代码:


int main()
{
  char* p = "abcdef";
  char arr1 = "hello";
  strcpy(p, arr1);
  printf("%s", p);
  return 0;
}


运行这段代码时,程序会直接挂掉,因为p是一个指针变量,并不是一个数组。


strcpy函数的模拟实现:


char* my_strcpy(char* dest,const char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*src)
  {
  *dest = *src;
  dest++;
  src++;
  }
    *dest = '\0';
  return ret;
}
int main()
{
  char src[] = "hello world!";
  char dest[20] = "abcdef";
  printf("%s", my_strcpy(dest, src));
  return 0;
}


2.3 strcat函数


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


函数要求:


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


函数功能:将source指向的字符串拷贝到destination所指向的字符串。


测试代码:


int main()
{
  char* p = "abcdef";
  char arr1 = "hello";
  strcat(p, arr1);
  printf("%s", p);
  return 0;
}


同样:运行这段代码时,程序会直接挂掉,因为p是一个指针变量,并不是一个数组。


strcat函数在运行时,会先找到第一个字符串的末尾的位置(也就是’\0’之前的位置),在该末尾位置将第二个字符串进行连接。


strcat函数的模拟实现:


char* my_strcat(char* dest,const char* src)
{
  assert(dest && src);
  char* ret = dest;
  while (*dest)
  {
  dest++;
  }
  while (*src)
  {
  *dest = *src;
  src++;
  dest++;
  }
  *dest = '\0';
  return ret;
}
int main()
{
  char arr1[20] = "xx";
  char arr2[20] = "hello world!";
  printf("%s", my_strcat(arr2, arr1));
  return 0;
}


注意:strcat函数不能对有关联的内存空间进行操作,否则会发生死循环。例如:以下这种用法就是错误的。因为arr和arr+2这两个内存空间是有关联关系的。


int main()
{
  char arr[20] = "hello world!";
  printf("%s", strcat(arr, arr+2));
  return 0;
}


2.4 strcmp函数


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


函数功能:按照字典序比较str1和str2这两个字符串的大小。


标准规定:


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


strcmp函数的模拟实现:


int my_strcmp(char* str1, char* str2)
{
  assert(str1 && str2);
  while (*str1 == *str2)
  {
  if (*str1 == '\0')
  {
    return 0;
  }
  str1++;
  str2++;
  }
  return *str1 - *str2;
}
int main()
{
  char arr1[10] = "abcdef";
  char arr2[10] = "a";
  printf("%d", my_strcmp(arr1,arr2));
  return 0;
}

2.5 strncpy函数


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


函数的第三个参数是要拷贝的字节的大小。与strcpy函数相比,由于能规定拷贝的字节大小,所以strncpy函数更可控。


函数功能:


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


使用案例:


int main()
{
  char arr1[20] = "xx";
  char arr2[20] = "hello world!";
  printf("%s", strncpy(arr1, arr2,4));
  return 0;
}


d362ad131c14e813fcc75f8af86cb10f_a1c31789aa6f4adb823703b5c94b3d28.png


2.6 strncat函数


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


函数功能:


  • 将source指向的字符串的前sum个字节追加到destination所指向的字符串中,并自动追加'\0'。
  • 如果source中字符串的长度小于num,其追加的长度仍为source的长度,并不会自己添加其他的内容。


使用案例:


int main()
{
  char arr1[20] = "xx";
  char arr2[20] = "hell\0oworld!";
  printf("%s", strncat(arr2, arr1,4));
  return 0;
}


49dc2f8fca3e18f5a2f83dc09ede8bd3_27702339a59b43c991095937c1bf3fed.png


2.7 strncmp函数


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


函数功能:


  • 比较直到出现字符不同或者一个字符串结束或者num个字符全部比较完毕。


使用案例:


#include <stdio.h>
#include <string.h>
int main ()
{
    char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
    int n;
    puts ("Looking for R2 astromech droids...");
    for (n=0 ; n<3 ; n++)
    if (strncmp (str[n],"R2xx",2) == 0)
    {
      printf ("found %s\n",str[n]);
    }
    return 0;
}

2a4d9b665283ac4a180ec6a964b68e0b_31f459b6e6184802af316f4d6206f685.png


相关文章
|
Java Spring 容器
|
编译器
【ARM汇编速成】零基础入门汇编语言之基本认识(一)
【ARM汇编速成】零基础入门汇编语言之基本认识(一)
394 0
|
9月前
|
人工智能 搜索推荐 安全
基于函数计算一键部署 AI 陪练,快速打造你的专属口语对练伙伴
AI 口语学习涵盖发音训练、对话交流、即时反馈、个性化场景模拟和流利度提升等。本方案以英语口语学习的场景为例,利用函数计算 FC 部署 Web 应用,结合智能媒体服务(AI 实时互动)的 AI 智能体和百炼工作流应用,实现英语口语陪练。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理的未来:让机器“听懂”人类语言的奥秘
1. 引言 在数字化浪潮中,自然语言处理(NLP)已经成为人工智能的核心技术之一。无论是智能助手、翻译应用,还是社交媒体的情感分析,NLP正以不可思议的速度改变我们的生活。根据市场研究,NLP的市场规模预计将在未来几年内快速增长,成为众多行业不可或缺的组成部分。本文将深入探讨NLP的基础知识、关键技术、实际应用以及未来的发展趋势,帮助你全面了解这一引人入胜的领域。
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
操作系统作为计算机系统的核心,其进程管理和调度策略对于系统性能和用户体验至关重要。本文将通过直观的代码示例和浅显易懂的语言,带领读者了解操作系统如何有效管理进程以及常见的进程调度算法。我们将从进程的基本概念出发,逐步深入到进程状态、进程控制块(PCB)的作用,最后探讨不同的调度算法及其对系统性能的影响。无论您是初学者还是有一定基础的开发者,都能从中获得有价值的信息。
|
机器学习/深度学习 人工智能 自动驾驶
人工智能浪潮下的未来职业图景
随着人工智能技术的飞速发展,未来的职场将呈现出前所未有的变化。从自动化取代重复性劳动到创造全新的行业岗位,AI的介入正逐步重塑我们对工作的认知和期待。本文将探讨AI技术如何影响职业发展的趋势,以及我们应如何准备迎接这一变革。
373 40
|
XML Java 应用服务中间件
springboot快速入门【小白也能看懂】
springboot快速入门【小白也能看懂】
247 0
|
机器学习/深度学习 数据采集 数据可视化
探索性数据分析(EDA)
探索性数据分析(EDA)
966 0
|
JavaScript Java 测试技术
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的汽车维修管理系统的设计与实现(源码+lw+部署文档+讲解等)
295 0
|
小程序 存储 UED
如何实现一次搭建 多平台适配的小程序
【6月更文挑战第3天】如何实现一次搭建 多平台适配的小程序