如何修改 strcat 使其不会编辑 str1

How do I modify strcat so that it wouldn't edit str1

本文关键字:编辑 str1 strcat 何修改 修改      更新时间:2023-10-16

为什么strcat给我str1的版本?据我所知,肯定有&如果你想在函数原型和实现中编辑参数参数之前的东西,但是我在这里没有看到它。

char *strcat( char *str1, const char *str2 );

我如何编辑这个函数,使它只返回新的字符串,但离开我给它的?我试着

char *strApp(char *dest, const char *src)
{
    size_t i,j;
    size_t k = 0;
    for (i = 0; dest[i] != ''; i++);
    char rdest[100];
    do {
        rdest[k] = dest[k];
    } while(++k<=i);
    for (j = 0; src[j] != ''; j++)
        rdest[i+j] = src[j];
    rdest[i+j] = '';
    return rdest;
}

会损坏第二根弦。谁能给我一个安全正确的版本?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *strApp(const char *s1, const char *s2)
{
    char *pointer = malloc(strlen(s1) + strlen(s2) + 1);
    if (pointer == NULL)
    {
        perror("failed to allocate memory");
        exit(EXIT_FAILURE);
    } 
    return strcat(strcpy(pointer, s1), s2);
}
int main()
{
    char *s1 = "original";
    char *s2 = " modified";
    char *s3 = strApp(s1, s2);
    printf("%sn", s1);
    printf("%sn", s2);
    printf("%sn", s3);
    free(s3);
    return 0;
}

只是想指出你不需要完全重写strcat()来得到你想要的。

根据定义,

strcat是在改变目标。如果您不愿意,您应该在您自己分配的目标内存位置中创建一个副本。

你用C和c++标记了你的问题。我提供了一个C解。c++可能需要调整


#include <stdlib.h>   
#include <string.h>
char* strdupcat(const char* s1, const char* s2) {
    size_t s1_len = strlen(s1);
    size_t s2_len = strlen(s2);
    char* s = malloc(s1_len + s2_len + 1);
    if (s == NULL)
        return NULL;
    {
        char* s_end = s;
        s_end = mempcpy(s_end, s1, s1_len);
        s_end = mempcpy(s_end, s2, s2_len);
        *s_end = '';
    }
    return s;
}

使用例子:

#include <stdio.h>
int main() {
    char* s = strdupcat("abc", "def");
    if (s == NULL) {
        perror("Can't concatenate");
        return EXIT_FAILURE;
    }
    puts(s);
    free(s);
    return EXIT_SUCCESS;
}

该函数的用法与strdup类似。

strdupcat() 函数返回一个指向新字符串的指针,该字符串是字符串s1的副本,并附加了字符串s2的副本。新字符串的内存通过 malloc (3)获得,通过 free (3)释放。

strdupcat() 函数返回一个指向重复字符串的指针,如果可用内存不足,则返回NULL

ENOMEM 内存不足,无法分配新字符串。

strdupcat()返回NULL时,可以使用strerrorperror获取错误信息。


这是一个接受任意数量参数的版本:

#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
char* strdupcatmany(int dummy, ...) {
#define strdupcatmany(...) strdupcatmany(0, __VA_ARGS__, NULL)
    size_t len = 0;
    char* s;
    char* s_dst;
    const char* s_src;
    va_list ap;
    va_start(ap, dummy);
    while (1) {
        s_src = va_arg(ap, const char*);
        if (s_src == NULL)
            break;
        len += strlen(s_src);
    }
    va_end(ap);
    s = malloc(len + 1);
    if (s == NULL)
        return NULL;
    s_dst = s;
    va_start(ap, dummy);
    while (1) {
        s_src = va_arg(ap, const char*);
        if (s_src == NULL)
            break;
        s_dst = stpcpy(s_dst, s_src);
    }
    va_end(ap);
    *s_dst = '';
    return s;
}
例如,

#include <stdio.h>
int main() {
    char* s = strdupcatmany("abc", "def", "ghi");
    if (s == NULL) {
        perror("Can't concatenate");
        return EXIT_FAILURE;
    }
    puts(s);
    free(s);
    return EXIT_SUCCESS;
}

注意:我不知道__VA_ARGS__ args的可移植性。