【C生万物】 字符串&内存函数篇 (上)(一)

简介: 【C生万物】 字符串&内存函数篇 (上)

前言


过了指针这个坎后,下一步就是C语言中关于字符的处理,这一期来讲讲常用字符函数和字符串函数:strlen,strcpy,strcat,memcpy,memmove,memcmp 等。


目录


Part1:写在前面

Part2:函数介绍

1.strlen

2.strcpy

3.strcat

4.strcmp

5.strncpy

6.strncat

7.strncmp

8.strstr

9.strtok

10.memcpy

11.memmove

12.memcmp

 

正文


Part1:写在前面


说到字符串大家应该不陌生了,但你知道如何处理字符串吗?


C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的(在C++中解决了这个问题,引入了string类),字符串通常放在常量字符串中或者 字符数组 中。

字符串常量 适用于那些对它不做修改的字符串函数 .


Part2:函数介绍


1.strlen


https://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen


size_t strlen ( const char * str );

这个函数是获取字符串长度的,下面是注意的点:


• 字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );

• 参数指向的字符串必须要以 '\0' 结束;

• 注意函数的返回值为 size_t ,是无符号的。


可以利用此函数来比较两个字符串的大小:

#include<stdio.h>
#include<string.h>
int main()
{
  const char* str1 = "abcdef";
  const char* str2 = "ggg";
  if (strlen(str2) - strlen(str1) > 0)
  {
    printf("str2>str1\n");
  }
  else
  {
    printf("srt1>str2\n");
  }
  return 0;
}

👁️‍🗨️运行结果:

4776d027aa4d4632a5358be8b5ed0803_c677db931e0c428badb73e2f481650b8.png


2.strcpy


https://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy


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

这个函数是用来拷贝字符串的


注意传参:将后部的字符串拷贝到前部的空间中


• 源字符串必须以 '\0' 结束;

• 会将源字符串中的 '\0' 拷贝到目标空间;

• 目标空间必须足够大,以确保能存放源字符串;

• 目标空间必须可变。


例子:

#include<stdio.h>
#include<string.h>
int main()
{
  char str1[40];
  const char* str2 = "abc";
  char* str = strcpy(str1, str2);
  printf("%s\n", str);
  return 0;
}

👁️‍🗨️运行结果:

c05f9ce86ee8a1f66e46832472ce7a8b_a46c0efd25ad4c66b2c9a42f8012f29d.png


3.strcat


https://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat


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

这个函数是在一个字符串末尾追加字符串的

• 源字符串必须以 '\0' 结束;

• 目标空间必须有足够的大,能容纳下源字符串的内容;

• 目标空间必须可修改。

例子:

#include<stdio.h>
#include<string.h>
int main()
{
  char str[80];
  strcpy(str, "these ");
  strcat(str, "strings ");
  strcat(str, "are ");
  strcat(str, "concatenated.");
  puts(str); // 输出字符串,传递char*类型,遇到\0结束
  return 0;
}

👁️‍🗨️运行结果:

5dfe3bc0ffa2d07eaad3d88c4aa8af45_c0d77e0204754e3faf5fe3d1cff07657.png


4.strcmp


https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp


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

这个函数的作用就是比较两个字符串的

标准规定:

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

• 第一个字符串等于第二个字符串,则返回0;

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

注意注意:不是比较字符串的长度,而是一个字符一个字符地比较字符的 ASCII 码值

例子:

#include<stdio.h>
#include<string.h>
int main()
{
  char* str1 = "abcdef"; 
  char* str2 = "abcdef";
  char* str3 = "abcde";
  char* str4 = "cpp";
  printf("%d\n", strcmp(str1, str2));
  printf("%d\n", strcmp(str1, str3));
  printf("%d\n", strcmp(str1, str4)); // 第一个字符就小
  return 0;
}

👁️‍🗨️运行结果:

4666c0eef7205a9da7f39cfb1dabc6fb_75cc82a3f49c42d6a18e56c304301b14.png

其实这个函数的最大作用就是0的情况,即判断两个字符串相等。


5.strncpy


https://legacy.cplusplus.com/reference/cstring/strncpy/?kw=strncpy


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

这个函数也是拷贝字符串的,不过它相比 strcpy 多了一个参数 num ,说明可以指定拷贝字符串的字符个数。


• 拷贝  num  个字符从源字符串到目标空间;

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


例子:

#include<stdio.h>
#include<string.h>
int main()
{
  char str1[40] = { '0' };
  char str2[30] = { '0' };
  const char* str3 = "abcdef";
  strncpy(str1, str3, 6);
  strncpy(str2, str3, 2);
  printf("%s\n", str1);
  printf("%s\n", str2);
  return 0;
}

👁️‍🗨️输出结果:

c17f9a1f72f9d377a154824556d996d2_9a3b5c5c3da241419c0712c0e6029036.png


6.strncat


https://legacy.cplusplus.com/reference/cstring/strncat/?kw=strncat


这个函数也是,加了 n ,可控制要追加的字符长度

• 追加字符,

例子:

#include <stdio.h>
#include <string.h>
int main()
{
  char str1[20];
  char str2[20];
  strcpy(str1, "To be "); str1 中存入 To be
  strcpy(str2, "or not to be"); str2 中存入 or not to be
  strncat(str1, str2, 6); str1 追加 str2 中的6个字符 or no
  puts(str1);
  return 0;
}

👁️‍🗨️输出结果:

8e7e77bab79a91f545452690670cdf56_c4178ad5f8754147a5024dbc075a663f.png


7.strncmp


https://legacy.cplusplus.com/reference/cstring/strncmp/?kw=strncmp


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

相比 strcmp,它可以指定最多比较 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;
}

👁️‍🗨️输出结果:

ecb748226d4e5a652d92dfa47d870b35_ee05de328ffe4ffdb06581982bd3249e.png

这个例子的意思就是在 str 中寻找含有 R2 的字符串。



目录
相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
13天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
35 6
|
1月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
27天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
22 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
40 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
66 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
70 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
378 0
|
26天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
55 1
|
30天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。