带你快速了解字符(串)函数(二)

简介: 带你快速了解字符(串)函数(二)

3. strcat函数


功能: 连接字符串


char * strcat ( char * destination, const char * source );
//destineion--指向目标数组的指针,该数组应包含字符串,并且足够大以包含串联的结果字符串
//source--要追加的字符串

将源字符串的副本追加到目标字符串。

目标中的终止空字符被源的第一个字符覆盖,并且在目标中由两者串联形成的新字符串的末尾包含一个空字符。


目的地和来源不得重叠。


🍤 实例:

#include <stdio.h>
#include <string.h>
int main()
{
  char str1[100]="hello ";
  char str2[] = "world";
  printf("%s\n", strcat(str1, str2));
  return 0;
}

🍤 运行结果:


46c1aebd2fc013e3cf1fbf54ba4d8f6b_c5155fe0ba13417c87797574991f8670.png


注:

🍥 源字符串必须以 ‘\0’ 结束。


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


🍥 目标空间必须可修改。


3.1 模拟实现

#include<stdio.h>
char* my_strcat(char*dest, const char *src)
{
  assert(dest && src);
  char* ret = dest;
  //1. 找目标空间中的\0
  while (*dest)
  {
    dest++;
  }
  while (*dest++ = *src++)//实现拷贝
  {
    ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "hello ";
  char arr2[] = "world";
  my_strcat(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}


4. strcmp函数


功能: 比较两个字符串


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

将字符串 str1 与字符串 str2 进行比较。


开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止空字符。


此函数执行字符的二进制比较。


标准规定:

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


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


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


🍤 实例1:


#include<stdio.h>
#include<string.h>
int main()
{
  printf("%d\n", strcmp("bbq","bcq"));
  return 0;
}

🍤 运行结果:

-1


🍤 实例2:猜动物


#include<stdio.h>
#include<string.h>
int main()
{
    char str1[] = "dog";
    char str2[80];
    do {
        printf("Guess my favorite animal? ");
        scanf("%s", str2);
    } while (strcmp(str1, str2) != 0);
    puts("Correct answer!");
    return 0;
}

🍤 运行结果:

1af09c0e8838785f78d160b153b20125_832c4e5055f44f9fa613ea3213f065fc.png


4.1 模拟实现

int my_strcmp(const char* str1, const char* str2)
{
  assert(str1 && str2);
  while (*str1 == *str2)
  {
    if (*str1 == '\0')
      return 0;
    str1++;//后移
    str2++;
  }
  return (*str1 - *str2);
}
int main()
{
  int ret = my_strcmp("bbq", "bcq");
  if (ret>0)
    printf(">\n");
  printf("%d\n", ret);//-1
  return 0;
}


5. strncpy函数


功能: 从字符串中复制字符


char * strncpy ( char * destination, const char * source, size_t num );
//destination--指向要在其中复制内容的目标数组的指针。
//source--要复制的 C 字符串。
//num--要从源复制的最大字符数。
//size_t 是无符号整数类型。

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


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


🍤 实例:


#include <stdio.h>
#include <string.h>
int main()
{
  char str1[] = "To be or not to be";
  char str2[40];
  char str3[40];
  strncpy(str2, str1, sizeof(str2));
  strncpy(str3, str2, 5);
  str3[5] = '\0';   
  puts(str1);//打印字符串
  puts(str2);
  puts(str3);
  return 0;
}

🍤 运行结果:

3cbfd243736679b23f418f9b3750b73f_9371631997a7454286cd8ce72aa61fd7.png


5.1 模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* sou, size_t num)
{
  char* ret = dest;
  assert(dest != NULL);
  assert(sou != NULL);
  for (int i = (int)num; i > 0; i--)
    *dest++ = *sou++;
  return ret;
}
int main()
{
  char str1[20] = "abcdef";
  char str2[] = "xxx";
  my_strncpy(str1, str2, sizeof(str1));
  puts(str1);
  return 0;
}

🍤 运行结果:

xxx

a92295c7a023dd8ec6a1e73037a78522_5f3062af011648d2a92a3f4cac080415.png


6. strncat函数


功能: 从字符串追加字符


char * strncat ( char * destination, const char * source, size_t num );
//destination--指向目标数组的指针,该数组应包含一个字符串,并且足够大以包含串联的结果字符串,包括其他 null 字符。
//source--要追加的 C 字符串。
//num--要追加的最大字符数。
//size_t是无符号整数类型。

将源的第一个数字字符追加到目标,外加一个终止空字符。


如果源中 C 字符串的长度小于 num,则仅复制终止空字符之前的内容。


🍤 实例1:


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

🍤 运行结果:

7deb4eb79ed2f8b983d3f60b9322d5c3_637d727f0f00470d9d5079ff1a83535f.png

🍤 实例2:


int main()
{
  char arr1[20] = "abcdef\0yyyyyyyy";
  char arr2[] = "xxxxxxxxx";
  strncat(arr1, arr2, 3);
  puts(arr1);//abcdefxxx
  return 0;
}

7004a633359cc63c7fa60fba2b4eac84_4b4a29d0a4354b2c94d482a380eb65d3.png

🍩说明了,遇到了结束标志 '\0' 就开始复制源代码


6.1 模拟实现

#include <stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* soc, size_t num)
{
  char* ret = dest;
  int i=0;
  int count = 0;
  assert(dest != NULL);
  assert(soc != NULL);
  while (*dest != '\0')
  {
    dest++;
  }
  while (num--)//终止条件:复制的个数num
    *dest++ = *soc++;//追加
  *dest = '\0';
  return ret;
}
int main()
{
  char arr1[20] = "abcdef\0yyyyyyyy";
  char arr2[] = "xxxxxxxxx";
  my_strncat(arr1, arr2, 3);
  puts(arr1);//abcdefxxx
  return 0;
}

🍤 运行结果:

c0a9c293b00f16394a7ce147274190e1_9efdcd0730c14eff9f1d7264a6a8ae8e.png


相关文章
|
C语言
带你快速了解字符(串)函数(一)
带你快速了解字符(串)函数(一)
|
6月前
字符拼接的深入理解
字符拼接的深入理解
31 0
|
5月前
|
C#
C# 中的字符与字符串
C# 中的字符与字符串
|
6月前
|
存储 C语言
c字符串
c字符串
36 0
带你快速了解字符(串)函数(三)
带你快速了解字符(串)函数(三)
实现一个函数,可以左右旋字符串中的k个字符
实现一个函数,可以左右旋字符串中的k个字符 ABCD左旋一个字符得到BCDA ABCD左旋两个字符的到CDAB ABCD右旋一个字符得到DABC ABCD右旋两个字符的到CDAB
|
存储 Shell 程序员
字符和字符串
一.案例:代码展示 二.如何给字符串赋值
字符和字符串