C语言 字符数组与字符串的关系strcmp/memcmp strcpy / memcpy

概述

字符数组和字符串在C语言中有密切的关系,可以说字符串就是以字符数组的形式存在的。

1. 字符数组:字符数组是C语言中的一种数据类型,它由一系列连续的字符元素组成。在C中,字符串实际上就是以字符数组的形式存储的。例如,`char str[10];` 就是一个字符数组,它可以存储最多10个字符。

2. 字符串:字符串是一串字符的序列,以 `\0`(空字符,ASCII值为0) 结尾。在C语言中,我们通常用字符数组来表示字符串,而且约定字符串的结尾必须是 `\0`,以便在处理字符串时能够正确确定字符串的结束位置。例如,"Hello" 是一个字符串,在C语言中可以用 `char str[] = "Hello";` 来表示。

字符串和字符数组的区别主要在于对字符串的约定:字符串必须以 `\0` 结尾,而字符数组没有这个约定。在字符数组中,我们可以存储任意字符,而不一定需要以 `\0` 结尾。但是,如果我们希望以字符串形式使用字符数组,就必须手动在最后一个位置添加 `\0` 终止符。

在许多C标准库函数(例如 `strlen`、`strcpy`、`strcmp` 等)中,都是基于字符串的概念,它们会自动处理以 `\0` 结尾的字符数组。因此,在处理字符串时,我们通常使用字符数组,并遵循以 `\0` 结尾的约定。

strcmp/memcmp

strcmp

以下是一个使用strcmp函数比较两个字符串的示例,在这个示例中,strcmp函数分别比较了str1str2,以及str1str3,并输出结果。result1将是一个非零值,因为"Hello"和"World"不相等,result2将为0,因为"Hello"和"Hello"是相等的。

C语言strcmp比较两个字符串是否相同_LSL_Blogs的博客-CSDN博客

#include <stdio.h>
#include <string.h>

int main() {
    const char str1[] = "Hello";
    const char str2[] = "World";
    const char str3[] = "Hello";

    int result1 = strcmp(str1, str2);
    int result2 = strcmp(str1, str3);

    if (result1 == 0) {
        printf("str1 and str2 are equal.\n");
    } else {
        printf("str1 and str2 are not equal.\n");
    }

    if (result2 == 0) {
        printf("str1 and str3 are equal.\n");
    } else {
        printf("str1 and str3 are not equal.\n");
    }

    return 0;
}

memcmp

strcmp函数用于比较以\0结尾的字符串,如果将一个char数组传递给strcmp函数,但它不以\0结尾,那么strcmp函数无法正确识别字符串的结束位置,可能导致错误的结果。可以考虑使用memcmp函数来进行字节级别的比较。memcmp函数用于比较指定数量的字节,不考虑字符串终止符。

C语言 memcmp 内存块的字节级别比较_LSL_Blogs的博客-CSDN博客

#include <stdio.h>
#include <string.h>

int main() {
    char array1[24] = "Hello";
    char array2[24] = "Hello";

    int result = memcmp(array1, array2, sizeof(array1));

    if (result == 0) {
        printf("array1 and array2 are equal.\n");
    } else {
        printf("array1 and array2 are not equal.\n");
    }

    return 0;
}

strcpy/memcpy

strcpymemcpy 是C语言中用于复制内存块的函数,但它们有不同的使用场景和目的。

strcpy

strcpy 函数用于将一个以\0结尾的字符串复制到另一个字符数组中。其原型在 string.h 头文件中声明如下:

char *strcpy(char *dest, const char *src);

其中,dest 是目标字符数组的指针,src 是源字符串的指针。函数返回值为指向目标字符数组的指针,即 dest

strcpy 会将源字符串 src 中的字符逐个复制到目标字符数组 dest 中,直到遇到源字符串的终止符 \0,并将 \0 也复制到目标字符数组中,从而确保目标字符数组成为一个有效的以 \0 结尾的字符串。

示例

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[20];

    strcpy(destination, source);

    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

输出

Source: Hello, World!
Destination: Hello, World!

memcpy

memcpy 函数用于在内存块之间复制一定数量的字节,而不仅仅用于字符串。其原型在 string.h 头文件中声明如下

void *memcpy(void *dest, const void *src, size_t n);

其中,dest 是目标内存块的指针,src 是源内存块的指针,n 是要复制的字节数。

memcpy 会从源内存块 src 复制 n 个字节到目标内存块 dest 中,不会考虑字符数组的终止符 \0。这意味着 memcpy 可以用于复制任意类型的数据,而不仅仅是字符串。比如字符数组

示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello, World!";
    char destination[20];

    // 使用memcpy复制字符数组
    memcpy(destination, source, sizeof(source));

    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

输出:

Source: Hello, World!
Destination: Hello, World!

总结:

  • 使用 strcpy 函数时,要确保目标字符数组有足够的空间容纳源字符串,以及终止符 \0
  • 使用 memcpy 函数时,要确保目标内存块有足够的空间容纳源内存块的字节,不需要考虑终止符 \0

总结

字符串和字符数组的区别主要在于对字符串的约定:字符串必须以 `\0` 结尾,而字符数组没有这个约定。在字符数组中,我们可以存储任意字符,而不一定需要以 `\0` 结尾。但是,如果我们希望以字符串形式使用字符数组,就必须手动在最后一个位置添加 `\0` 终止符。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值