【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 的字符串。



目录
相关文章
|
2月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
|
2月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
|
2月前
【C初阶】内存函数:memcpy+memmove+memset+memcmp
【C初阶】内存函数:memcpy+memmove+memset+memcmp
|
3月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
35 0
【C语言】字符函数,字符串函数,内存函数
|
4月前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
39 0
|
4月前
|
程序员 C语言
C语言内存管理:malloc、calloc、realloc与free函数详解
C语言内存管理:malloc、calloc、realloc与free函数详解
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
3月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
215 14
|
2月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储
|
3月前
|
存储 固态存储 芯片
计算机中内存与存储
【7月更文挑战第28天】
43 1

热门文章

最新文章

下一篇
无影云桌面