jazyk C - retazce

Programovacie jazyky, rady, poradňa...
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

jazyk C - retazce

Príspevok od používateľa rado06 »

ahojte,
ucim,ucim Ccko a dost veciam tam nechapem :-/, viem ze niektore su easy ked to clovek pochopi, ked to niekto vysvetli no sam to luskam dost dlho :cry: .
ale k veci potreboval by som nejake rady pri retazcoch, napr. v kode je if kde musim davat getchar koli enteru to chapem ale nechapem preco iba pri prvom cykle a potom je to v pohode, tak isto pri vypise mi to neslo a druhy a kazdy dalsi retazec vypisovalo az od druheho znaku...je tam viacej veci co nerozumiem tak keby mi to niekto vysvetlil polopate tak by mi usetril asi tak dva dni :D dik

Kód: Vybrať všetko

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

int main()
{
    int n,i;
    char **p;

   printf("Kolko retazcov budes zadavat? ");
   scanf("%d",&n);

   p = (char**)malloc(sizeof(char*)*n);
    for(i=0;i<n;i++)
        p[i] = (char*)malloc(sizeof(char)*51); //<-- da sa aj druhy rozmer pola vytvarat dynamicky?,
                                               //ked jeho dlzku bude vediet az po vstupe z klavesnice

    for(i=0;i<n;i++){
        printf("Zadaj %d. retazec (max.50 znakov):\n",i+1);
        if (i==0)   // <-- tymto dvom riadkom nerozumiem,bez nich mi to robilo blbosti
        getchar();
        gets(p[i]);
    }
    putchar('\n');

    for(i=0;i<n;i++){
        puts(p[i]); //<-- dalo by sa to napisat cez pointer? ako?
    }
// a este by som potreboval poradit, ako tie jednotlive nacitane retazce usporiadat 
// nech su v tom vypise podla abecedy?

    free(p);
    return 0;
}
to usporiadenie retazcov nechcem kod iba navod ako to urobit, aby som sa to aj naucil a nie len odpisal
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8224
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: jazyk C - retazce

Príspevok od používateľa harrison314 »

Odpoved na prvu otazku:
Aj to druhe pole mozes vytvarat dynamicky, ale vstup z klavesnice musis nacitat do nejakeho bufferu
napr

Kód: Vybrať všetko

char buffer[51]; // mozes ho vytvarat aj dynamicky

// das to do ciklu

scanf("%s",buffer);

p[1] = (char*) malloc( strlen(buffer) +1 );  // zisti dlzku retazca, ta +1 je na ukoncovyci nulovy byt
strcpy(p[1] , buffer );

// koniec ciku
Na druhu otazku:

Kód: Vybrať všetko

for(i=0;i<n;i++){
        puts(p[i]); // dalo aqle mas to jedno lebo p je pointer na pinter , p[i] je pointer na znaky
 // ak to chces od druheho znaku staci puts(p[i] + 1);
    } 
A tie dav riadky ktorim nerozumies sluzia len nato aby pri nacitani z klavesnice nenacilo prvy retazec prazdny, lebo
tam zostal enter z predchazdajuceho vstupu
da sa to riesit aj

Kód: Vybrať všetko

while(getch() != '\n' ); // toto mo obcas lagovalo, ale na vyske to ucia tak

// alebo moje vlastne riesenie

fseek(stdin,SEEK_END, 0); // presunie ukazovatel standardneho vstupu na koniec

Na zoradenie retazca si pozri v googli maxsort, je celkom jednoduchy a na male polia dost dobry, hlavne je lahsie pochopitelny ako quiksort, a retazce budes porovnavat pomocou funkcie strcmp

A este zle dealohkujes "p"
len free(p); nestaci , lebo dealokuje len p, a tie ostatne polozky tam zostanu
spravne by sa to malo robyt takto

Kód: Vybrať všetko

for(i=0; i< Dlzka_p; i++) free( p[i]);
free(p);



Este sory za pripadne chyby
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

Re: jazyk C - retazce

Príspevok od používateľa rado06 »

harrison314
dakujem,
presne takuto odpoved som potreboval, dost mi to pomohlo a este som sa aj pobavil // koniec ciku :D
Napísať odpoveď