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

目录
相关文章
|
2天前
|
编译器 程序员 Serverless
|
1天前
|
机器学习/深度学习 C语言
详细解读C语言math.h中常用函数
详细解读C语言math.h中常用函数
|
1天前
|
C语言
C语言刷题(函数)
C语言刷题(函数)
|
19小时前
|
存储 编译器 C语言
C语言的联合体:一种节省内存的数据结构
C语言的联合体:一种节省内存的数据结构
6 0
|
19小时前
|
C语言
C语言中的函数指针、指针函数与函数回调
C语言中的函数指针、指针函数与函数回调
5 0
|
19小时前
|
存储 C语言
C语言中的变量与函数详解
C语言中的变量与函数详解
2 0
|
19小时前
|
安全 C语言 开发者
C语言中的字符串
C语言中的字符串
4 0
|
21小时前
|
存储 C语言
C语言中的printf函数详解
C语言中的printf函数详解
6 0
|
12天前
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之 从Kafka读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
11 2