Prace s retezci – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prace s retezci – C / C++ – Fórum – Programujte.comPrace s retezci – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
matesomg0
Duch
7. 12. 2016   #1
-
0
-

Chtěl bych se zeptat, jak vsunout jeden řetězec do druhého.

Vím, že to bude asi přes funkci strcat, ale nevím přesně jak

Nahlásit jako SPAM
IP: 188.75.128.–
gna
~ Anonymní uživatel
1891 příspěvků
7. 12. 2016   #2
-
0
-

Toto z řetězce vytvoří nový, který bude obsahovat původní i vložený. Možná to nepotřebuješ až takto, ale můžeš se od toho odpíchnout.

char *stary = "pes kocka";
char *vlozit = "ptak ";
int kamvlozit = 4;

if (kamvlozit > strlen(stary)) chyba();

char *novy = malloc((strlen(stary) + strlen(vlozit) + 1) * sizeof(char));

// zacatek
strncpy(novy, stary, kamvlozit);
novy[kamvlozit] = 0;

// vlozeni
strcat(novy, vlozit);

// konec
strcat(novy, stary + kamvlozit);

printf("stary '%s'\nnovy '%s'\n", stary, novy);
stary 'pes kocka'
novy 'pes ptak kocka'
Nahlásit jako SPAM
IP: 213.211.51.–
matesomg0
Duch
7. 12. 2016   #3
-
0
-

#2 gna
díky moc. Ještě bych se chtěl zeptat, kdyz spustim program, tak mi to vypíše 1. string v pohodě, ale v druhém a třetím jsou na začátku nechtěné znaky, za boha nemůžu najít chybu

ZDROJÁK: 

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

void strins(char pole1[],int i,char pole2[]);    //

main()
{
  char str1[80] = "Jazyk C - nemozne!";
  char str2[80] = " dokaze i ";
  char str3[80] = " nekdy";

    printf("%s",str1);    
    strins(str1,10,str2);    
    printf("\n%s",str2);   
    strins(str2,20,str3);    
    printf("\n%s",str3);    
}

void strins(char pole1[],int i,char pole2[])
{   int c;
    char *novy;
    novy=(char *)malloc(strlen(pole1)+strlen(pole2)+1);

    strncat(novy,pole1,i);
    strcat(novy,pole2);
    strcat(novy,pole1+i);
    //novy[strlen(pole1)+strlen(pole2)]='\0';
    for(c=0;c<strlen(novy);c++)pole2[c]=novy[c];

}

Nahlásit jako SPAM
IP: 188.75.128.–
gna
~ Anonymní uživatel
1891 příspěvků
7. 12. 2016   #4
-
0
-

str(n)cat přidává na konec řetězce. Konec řetězce najde podle nulového ukončovacího znaku.

Takže pokud je v tom alokovaném bufferu nějaké smetí, tak se to přidá až za to (na první nalezenou nulu v tom smetí).

Takže můžeš na začátek toho bufferu vložit nulu, aby to jako byl prázdný řetezec, nebo místo strncat použít strncpy (ten prostě kopíruje tam kam jsi zadal).

Podobně strncat a strncpy do cílového bufferu nevloží ukončovací nulu za ten zkopírovaný řetězec (pokud byl delší než požadovaná velikost), takže ji tam zase musíš vložit sám.

Prostě jeden řádek máš jinak než já a jeden ti tam chybí :-) A nakonec bys tu alokovanou paměť měl uvolňovat.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
7. 12. 2016   #5
-
0
-

Jo a v tom foru nakonci zase kopíruješ jen data bez bez toho ukončovacího znaku. Takže kopíruj o znak víc, nebo tam na konec tu nulu "ručně" přidej, nebo prostě použij strcpy(pole2, novy).

Nahlásit jako SPAM
IP: 213.211.51.–
matesomg0
Duch
7. 12. 2016   #6
-
0
-

#5 gna

Paráda, děkuju moc za pomoc :) už to šlape.

Nahlásit jako SPAM
IP: 188.75.128.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 79 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý