Duplikowanie lancuchu znakow w c

Duplikowanie lancuchu znakow w c
K3
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 2 lata
  • Postów:34
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

artur_waw
  • Rejestracja:ponad 18 lat
  • Ostatnio:prawie 2 lata
  • Postów:155
2

Może za pomocą sprintf?

Kopiuj
#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.

K3
jest blisko, wyswietla sie bat\nbat a nie chcialbym w tym znaku nowej lini, tylko zlaczone batbat
Yerbanos
  • Rejestracja:około 7 lat
  • Ostatnio:ponad rok
  • Postów:46
1

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

Kopiuj
#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;
}
edytowany 2x, ostatnio: Yerbanos
_13th_Dragon
Mażesz po pamięci.
Yerbanos
W sensie? 4 linijki po alokacji kończy się program więc to chyba nie zbrodnia ;)
_13th_Dragon
Na 10 "bat" przydzieliłeś 30 bajtów pamięci, brak '\0' na końcu, więc możesz dostać śmieci przy wydruku. https://wandbox.org/permlink/fH8AEYAjmEk5kTDr#
Yerbanos
Nie dość że to zrobiłem to jeszcze tego nie zauważyłem po pierwszej uwadze. Czas iść spać.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 2 godziny
1
Kopiuj
#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;
}

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 14 godzin
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:

Kopiuj
#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)

edytowany 3x, ostatnio: Azarien
_13th_Dragon
Ma być CStringOfCountCStrings
MarekR22
Wiem ze moglbym to zrobic printf("%s%s", msg, msg), ale chcialbym miec to w jednej zmiennej
kq
Huh, dałbym se rękę uciąć, że ta funkcja była w bibliotece C... No i bym nie miał ręki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.