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

目录
相关文章
|
9天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
25 6
|
11天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
33 6
|
23天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
35 3
|
22天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
27天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
54 7
|
25天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
21 0
|
25天前
|
C语言
【c语言】qsort函数及泛型冒泡排序的模拟实现
本文介绍了C语言中的`qsort`函数及其背后的回调函数概念。`qsort`函数用于对任意类型的数据进行排序,其核心在于通过函数指针调用用户自定义的比较函数。文章还详细讲解了如何实现一个泛型冒泡排序,包括比较函数、交换函数和排序函数的编写,并展示了完整的代码示例。最后,通过实际运行验证了排序的正确性,展示了泛型编程的优势。
20 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
376 0
|
24天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
50 1
|
28天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。