c语言:字符串和内存函数介绍-1

简介: c语言:字符串和内存函数介绍

1、strlen(包含于头文件string.h)

  • strlen是一种求字符串长度的函数,它的定义为
size_t strlen ( const char * str );
//引用头文件  string.h
  • strlen的目标字符串以‘\0’作为结束标志,返回的则是'\0'之前出现的字符的个数(不包含'\0');
  • 参数(目标字符串)必须以'\0'结尾,否则就会越界读取,返回一个错误值(随机值);
  • strlen的返回类型size_t类型(无符号类型)
  • 举例:
#include<stdio.h>
#include<string.h>
int main()
{
  char arr[] = { "abcdefg" };//一共7个字符
  int ret = strlen(arr);
  printf("%d", ret);
 
  return 0;
}

  • 模拟实现strlen函数
#include<stdio.h>
int my_strlen(  char* arr)
{
  
  char* end = arr;
  while(*end++ )
  ;
  return end - arr-1;
}
int main()
{
  char arr[] = { "abcdefgh" };
  int len=my_strlen(arr);
  printf("%d", len);
 
  return 0;
}

2、strcpy(包含于头文件string.h)

  • strcpy是一种字符串拷贝的函数,它的定义为:
char* strcpy(char * destination, const char * source );
  • strcpy将source指向的字符串拷贝到destination所指向的字符串当中;
  • 源字符串必须以 '\0' 结束;
  • 会将源字符串中的 '\0' 拷贝到目标空间;
  • 目标空间必须足够大,以确保能存放源字符串。否则可能会造成缓冲溢出的情况;
  • 目标空间必须可变。(目标空间如果不可修改则会程序崩溃)
  • 举例
#include<stdio.h>
#include<string.h>
int main()
{
  char source[] = { "xxxx" };
  char destination[20] = { "abcdefgh" };
  strcpy(destination,source);
  printf("%s", destination);
  return 0;
}

  • 模拟实现 :
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* str)
{
  assert(*dest != NULL);
  assert(*str != NULL);
  char* ret = dest;
  //拷贝str指向的字符串到dest指向的空间,包含'\0'
  while (*dest++ = *str++)
  {
    ;
  }
  //返回目的空间的起始地址
  return ret;
}
int main()
{
  char arr1[] = "abcdefghi";
  char arr2[] = "bit";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  printf("%s\n", arr2);
  return 0;
}

3、 strcat(包含于头文件string.h)

  • strcat函数定义为:
char * strcat ( char * destination, const char * source );



  • 将source所指向的字符串追加到destination所指向的字符串后面(从destination中从左至右找到的第一个'\0'开始往后追加);
  • 源字符串必须以 '\0' 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。
  • 举例
#include<stdio.h>
#include<string.h>
int main()
{
  char destination[20] = { "abcd" };
  char source[] = { "xxxx" };
  strcat(destination, source);
  return 0;
}


  • 模拟实现:(函数主体构建这里不再赘述)
char *my_strcat(char *dest, const char*src) {
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
 dest++;
 }
 while((*dest++ = *src++))
 {
 ;
 }
 return ret; }


4、strcmp(包含于头文件string.h)

  • strcmp函数定义为:
int strcmp ( const char * str1, const char * str2 );


  • strcmp将str2指向的字符串和str1指向的字符串从第一个开始逐个向后比较,并规定标准

返回值对比

    字符串大小        返回值

第一个字符串大于第二个字符串

 返回大于0的数字

第一个字符串等于第二个字符串

 返回0

第一个字符串小于第二个字符串

 返回小于0的数字


  • 举例:例如字符串"abcd"

      和 "abce" 由于'e'>'d',则第二个字符串>第一个字符串,返回小于0的数字 

        "abdd"

        "abce" 由于'd'>'c',则第一个字符串>第二个字符串,返回大于0的数字


模拟strcmp函数:

#include<stdio.h>
 
int my_strcmp(char* arr, char* crr)
{
  while (*arr && *crr)
  {
    if (*arr == *crr)
    {
      arr++;crr++;
    }
    else if (*arr > *crr)
      return 1;
    else 
      return -1;
  }
  if (*crr == '\0' && *arr == '\0')
    return 0;
  else if (*crr = '\0')
    return 1;
  else
    return -1;
}
int main()
{
  char arr[] = { "abce" };
  char crr[] = { "abce" };
  int ret = my_strcmp(arr, crr);
  printf("%d", ret);
  return 0;
}


5、strstr (包含于头文件string.h)

  • strstr函数定义为
char * strstr ( const char *str1, const char * str2);


  • strstr用于找到str1所指向的字符串中第一次出现str2所指向的字符串的地址
  • 举例:
#include<stdio.h>
int main()
{
char arr[]={"abcdefabcdef"};
char brr[]={"bcd"};
char* p=strstr(arr,brr);
return 0;
}


模拟实现:

#include<stdio.h>
char* my_strstr( char* str1, char* str2)
{
  
  
  if (*str2 == '\0')
    return str1;
 
  while (*str1)
  {   char* p = str1;
      char* crr = str2;
    while (*crr == *p)
    {
      p++;
      crr++;
    }
    if (*crr == '\0')
      return str1;
    str1++;
  }
  return (NULL);
}
int main()
{
  char arr[] = { "abcdefbbcdef" };
  char crr[] = { "cde" };
  char* p = my_strstr(arr, crr);
  printf("%c", *p);
  return 0;
}


6、7、8、strncpy,strncat,strncmp(均包含于string.h中)

区别于strcpy,strcat,strcmp,他们之间多了一个n,这个n就用于固定要访问的字符串长度。

在不讨论返回值的情况下,他们都有一个固定的格式 

strn ***(char*destination,char*source,int n)


  • strncpy,固定从source所指向的字符串当中拷贝从第一个字符开始,长度为n的字符串到destination所指向的字符串当中。
  • strncat,将source所指向的字符串的前n个字符追加到destination所指向的字符串当中(覆盖掉destination指向的字符串末尾的

        '\0')。如果n大于字符串长度,则会追加全部字符。


  • strncmp,比较两个字符串的前n个字符,比较方法不变。


c语言:字符串和内存函数介绍-2

https://developer.aliyun.com/article/1515659

目录
相关文章
|
11天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
24 3
|
10天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
16天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
40 7
|
16天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
25 4
|
13天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
14 0
|
13天前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
15 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
330 0
|
12天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
23 1
|
17天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
21天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。