Duplikowanie lancuchu znakow w c

0

Czesc, zastanwiam sie jak w jezyku C zduplikowac napis, mam na mysli to że ze zmiennej msg = "bat" tworze dupMsg = "batbat"
Wiem ze moglbym to zrobic printf("%s%s", msg, msg), ale chcialbym miec to w jednej zmiennej

2

Może za pomocą sprintf?

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

int main()
{
    char *s = "bat";
    char *r = malloc(sizeof(char) * strlen(s) * 2 + 1);
    
    sprintf(r, "%s%s", s, s);
    
    printf("%s", r);

    return 0;
}

Pisane na szybko więc nie daję głowy że dobrze policzyłem rozmiar bufora do zapisu.

1

chyba najwygodniej użyć memcpy, tutaj akurat przykład dla większej ilości ;)

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

#define TIMES 10

int main(void)
{
    char *bat = "bat";
    char *bats = calloc(TIMES * strlen(bat)+1, sizeof(char) );

    for(uint32_t i=0; i<TIMES; i++) {
        memcpy(bats+(i*strlen(bat)), bat, strlen(bat));
    }

    printf("%s", bats);
    free(bats);
    return 0;
}
1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *bat = "bat";
    const int TIMES=3;

    char *bats=strcpy((char*)malloc(TIMES*strlen(bat)+1),bat);
    for(int i=1;i<TIMES;++i)  strcat(bats,bat);
    printf("%s", bats);
    free(bats);
    return 0;
}
1

Dotychczas niestandardowa (a ściślej: ze standardu POSIX) funkcja strdup() ma się znaleźć w nadchodzącym standardzie C23, więc można jej użyć jeśli jest dostępna:

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

int main()
{
    const char* s = "bat";
    const char* r = strdup(s);

    printf("%s", s);
    printf("%s", r);

    return 0;
}

(pod Visual Studio trzeba dodać zmienną preprocesora _CRT_NONSTDC_NO_DEPRECATE bo inaczej będzie bzdurny error)

1 użytkowników online, w tym zalogowanych: 0, gości: 1