如何修改strcat以便它不会编辑str1

时间:2016-07-03 14:45:10

标签: c++ c windows

为什么strcat会给我str1的版本?据我所知,必须有&函数原型和实现中的paramatater之前的事情,如果你想编辑它,但我不会在这里看到它。

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] != '\0'; i++);
    char rdest[100];
    do {
        rdest[k] = dest[k];
    } while(++k<=i);
    for (j = 0; src[j] != '\0'; j++)
        rdest[i+j] = src[j];

    rdest[i+j] = '\0';
    return rdest;
}

它损坏了第二根弦。谁能给我安全正确的版本?提前谢谢。

3 个答案:

答案 0 :(得分:2)

#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("%s\n", s1);

    printf("%s\n", s2);

    printf("%s\n", s3);

    free(s3);

    return 0;
}

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

答案 1 :(得分:0)

根据定义,strcat是改变目标的。如果你不想,你应该自己在你自己分配的目标记忆位置制作副本。

答案 2 :(得分:0)

您已使用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 = '\0';
    }

    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 内存不足,无法分配新字符串。

strerror返回perror时,您可以使用strdupcat()NULL获取错误消息。

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

#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 = '\0';

    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。