strcat函数与strncat函数的学习

strcat 函数

stract 函数的学习

stract是C语言中的一个标准库函数,用于连接两个止符串。它定义在string.h头文件中。

函数原型

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

参数

  • dest:这是一个指向目标字符串的指针,该函数会将源字符串(src)添加到这个字符串的末尾。需要注意的是,dest 必须有足够的空间来保存合并后的字符串,否则可能会导致缓冲区溢出,这是一个严重的安全隐患。
  • src:这是一个指向源字符串的指针,该字符串的内容将被添加到 dest 字符串的末尾。

返回值

strcat返回函数dest字符串的指针。

注意事项

  1. 缓冲区溢出:在使用 strcat 时,必须确保 dest 字符串有足够的空间来存储合并后的字符串。如果没有足够的空间,该函数可能会导致缓冲区溢出,这是一个严重的安全问题。
  2. 字符串结束符:strcat 函数通过查找空字符(\0)来确定字符串的结尾。因此,确保所有字符串都正确终止是非常重要的。
  3. 效率问题:strcat 函数在每次调用时都会从 dest 字符串的末尾开始搜索 \0 字符,这可能会影响性能。如果多次追加到同一个字符串,使用 strncat 或其他方法可能会更高效。
  4. strcat 函数是用来将一个字符串(源)追加到另一个字符串(目标)的尾部。但是,你不能直接使用 strcat 来将一个字符数组(或字符串)追加到它自己的尾部,因为这会导致缓冲区溢出和未定义行为。

示例

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char dest[50] = "Hello, ";  
    char src[] = "World!";  
      
    strcat(dest, src);  
    printf("%s\n", dest);  // 输出:Hello, World!  
      
    return 0;  
}

strcat函数的模拟实现

参考代码

在这里插入代码片#include <stdio.h>  
  
char *stccat(char *dest, const char *src) {  
    char *pdest = dest;  
  
    // 移动到dest字符串的末尾  
    while (*dest) {  
        dest++;  
    }  
  
    // 将src字符串的字符逐个复制到dest的末尾,直到遇到src的结束符'\0'
    //并在dest字符串结束后添加'\0‘。  
    while (*dest++ = *src++) {  
        ;  
    }  
    return pdest;  
}  
  
int main() {  
    char dest[50] = "Hello, ";  
    char src[] = "World!";  
  
    stccat(dest, src);  
    printf("%s\n", dest);  // 应该输出:Hello, World!  
  
    return 0;  
}

注意:以上代码只能destsrc必须是两个不同的数组。

strncat 函数

strncat函数的学习

strncat 是 C 标准库中的一个函数,用于将一个字符串的部分内容连接到另一个字符串的末尾。这个函数定义在 <string.h> 头文件中,与 strcat 相比,strncat 提供了一个额外的参数来限制追加的字符数,从而可以在一定程度上防止缓冲区溢出。

函数原型

char *strncat(char *dest, const char *src, size_t n);

参数

  • dest:指向目标字符串的指针,即要将 src 追加到的字符串。
  • src:指向源字符串的指针,即要追加的字符串。
  • n:表示要从 src 追加到 dest 的最大字符数。

返回值

strncat 函数返回指向 dest 字符串的指针。

功能

strncat 函数从 src 字符串中取最多 n 个字符(不包括终止空字符 \0),并将它们追加到 dest 字符串的末尾。然后,在追加的字符串后面添加一个空字符 \0,以标记新字符串的结束。

注意事项

  1. 缓冲区大小:虽然 strncat 提供了字符数限制,但调用者仍然需要确保 dest缓冲区足够大,以容纳原始 dest 字符串、要追加的 src 字符串部分以及一个额外的空字符。

  2. 字符串长度与字符数:参数 n 指定的是要追加的字符数,而不是字节数。在多字节字符集(如 UTF-8)中,一个字符可能占用多个字节,因此需要特别注意。

  3. 空字符的处理:strncat 在追加完 src 中的字符后,会在 dest 的末尾添加一个空字符 \0。这意味着如果 dest 原本就没有足够的空间来追加 n 个字符和一个空字符,那么会导致缓冲区溢出。

  4. 性能考虑:与 strcat 类似,strncat 也需要从 dest 的末尾开始搜索空字符,这可能会影响性能。如果多次对同一个 dest 字符串进行追加操作,性能可能会受到影响。

  5. strnca也是不可直接使用 strcat 来将一个字符数组(或字符串)追加到它自己的尾部。

示例

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char dest[20] = "Hello";  
    char src[] = " World";  
      
    strncat(dest, src, 5); // 只追加 " Worl" (注意空格)  
    printf("%s\n", dest);  // 输出:Hello Worl  
      
    return 0;  
}

strncat 函数的模拟实现

参考代码

char *my_strncat(char *ch1, const char *ch2, size_t x) {
    assert(ch1 && ch2);
    char *p = ch1;
    while (*ch1 != '\0') {
        ch1++;
    }
    while (x-- && *ch2) {
        *ch1++ = *ch2++;
    }
    *ch1 = '\0';

    return p;
}

int main() {
    char ch1[100] = {"Welcome to "};
    char ch2[] = {"Beijing!!!,shanghai!!!,Guangdong!!!,Shenzhen!!!"};
    char *ch3 = strncat(ch1, ch2, 10);
    printf("%s\n", ch3);

    return 0;
}

注意:以上代码只能destsrc必须是两个不同的数组。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值