Avatar
Hadi.k
Člen
Avatar
Hadi.k:

Jak mohu vytvořit pole řetězců ? Třeba 10 řádků a na každém bude řetězec. Tedy další pole s charama. Zkusil sem to takhle, ale to očividně nefunguje, je tu někdo, kdo tuší jak na to, na netu jsem toho moc nenašel. A prosil bych o neobjektové řešení, pokud existuje a hlavně co nejjednoušší.

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

int main()
{

    char *pole[2][80] = {{"0","1","2"},{"Rano","Odpoledne","Vecer"}};
    int i,s;

    for(i=0;i<=2;++i){
            for(s=0;s<=80;++i){
                printf("%c",pole[i][s]);
            }
            printf("\n");
    }
    return 0;
}
Editováno 16.4.2014 12:07
Odpovědět 16.4.2014 12:07
"Ajťák" nikdy nebere telefon po prvním zazvonění!! Vždy je totiž velice vytížen - buď musí nejprve dopít ká...
Avatar
Hadi.k
Člen
Avatar
Odpovídá na Hadi.k
Hadi.k:
#include <stdio.h>
 #include <stdlib.h>

 int main()
 {

     char *pole[2][80] = {{"0","1","2"},{"Rano","Odpoledne","Vecer"}};
     int i,s;

     for(i=0;i<=2;++i){
             for(s=0;s<=80;++s){
                 printf("%c",pole[i][s]);
             }
             printf("\n");
     }
     return 0;
 }

Opravenej kod ktery stejně nefunguje. (Puvodin přispevek nejde už upravit)

Nahoru Odpovědět 16.4.2014 12:11
"Ajťák" nikdy nebere telefon po prvním zazvonění!! Vždy je totiž velice vytížen - buď musí nejprve dopít ká...
Avatar
Tycek
Člen
Avatar
Odpovídá na Hadi.k
Tycek:

Musíš použít pole? Pokud ne, dalo by se to uložit do struktury.

Editováno 16.4.2014 14:08
 
Nahoru Odpovědět 16.4.2014 14:07
Avatar
tomisoka
Redaktor
Avatar
Odpovídá na Hadi.k
tomisoka:

no já to řeším takto:

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

int main(){

    //máš předem zadáno kolik řetězců budeš mít (tady 3)
    char *pole[3] = {"Rano","Odpoledne","Vecer"};

    int i;
    for(i=0;i<3;i++){
        printf("%s\n",pole[i]);
    }


    //můžeš měnit počet řetězců
    int pocet_retezcu = 3;
    char **Pole;

    Pole = malloc(pocet_retezcu*sizeof(char *));
    Pole[0] = "Rano";
    Pole[1] = "Odpoledne";
    Pole[2] = "Vecer";

    for(i=0;i<pocet_retezcu;i++){
        printf("%s\n",Pole[i]);
    }

    return 0;
}
 
Nahoru Odpovědět  +1 16.4.2014 14:51
Avatar
Odpovídá na Hadi.k
Libor Šimo (libcosenior):

Otestuj si toto:

#include <stdio.h>

int main(void)
{
    int i = 0;
    char *pole[] = {"pondelok", "utorok", "streda", "stvrtok", "piatok", "sobota",
                    "nedela", "sabat", "vianoce", "velka noc", "vsetkych svatych"};

    while (i < sizeof(pole) / sizeof(char *)) // sizeof(pole) / sizeof(char *) je pocet pointerov
        printf("%s\n", pole[i++]); // pole[i] je pointer na reťazec

    return 0;
}

A ak chceš, mrkni sa na Herouta: http://www.freespace.sk/…5%A1kola-r26

Editováno 16.4.2014 15:50
Nahoru Odpovědět  +1 16.4.2014 15:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Hadi.k
Člen
Avatar
Hadi.k:

Díky všem za pomoc, řešení s dynamickým polem je velmi pohodlné :) Rozhodně to využiji.

Nahoru Odpovědět 17.4.2014 17:01
"Ajťák" nikdy nebere telefon po prvním zazvonění!! Vždy je totiž velice vytížen - buď musí nejprve dopít ká...
Avatar
Odpovídá na Hadi.k
Libor Šimo (libcosenior):

Normálne sa používajú dynamické polia, nie definované pri deklarácii.
Napríklad keď chceš do poľa stringov vložiť obsah textového súboru po riadkoch.
Teda čo riadok, to položka poľa stringov.

Nahoru Odpovědět 17.4.2014 17:07
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Hadi.k
Člen
Avatar
Hadi.k:

Měl bych otázku, proč mi nefunguje tento kod, hází to chybu (neodesílat).

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

int main()
{
    FILE *soubor;
    char radek[80];
    char **data;
    int pos = 0;
    int i;


    soubor = fopen("names.txt","r");

   while(fscanf(soubor,"%[^\n]", radek) != EOF){
        getc(soubor);
        data[pos] = radek;
        pos++;

    }

    for(i=0;i<pos-1;i++){
        printf("%s \n",data[i]);
    }

    return 0;
}

Tady je soubor:

Zina Millerová
Renáta Šustová
David Kresta
Nataša Chroustová
Robert Bartušek
Irena Langerová
Hynek Živný
Nina Vaňousová
Hubert Šustr
Lada Průchová
Bořivoj Strmiska
Svatoslav Bursa
Zikmund Šilar
Markéta Břízová
Edita Spurná
Bronislav Čapek
Marina Indrová
Editováno 20.4.2014 11:31
Nahoru Odpovědět 20.4.2014 11:28
"Ajťák" nikdy nebere telefon po prvním zazvonění!! Vždy je totiž velice vytížen - buď musí nejprve dopít ká...
Avatar
Hadi.k
Člen
Avatar
Hadi.k:

Po úpravě je vystup takovy že se mi vypíše Xkrát poslední jméno.

Nahoru Odpovědět 20.4.2014 11:36
"Ajťák" nikdy nebere telefon po prvním zazvonění!! Vždy je totiž velice vytížen - buď musí nejprve dopít ká...
Avatar
Odpovídá na Hadi.k
Libor Šimo (libcosenior):

Určite to ide aj jednoduchšie, ale ja by som to riešil asi takto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUBOR "names.txt" // makro definuje názov súboru

/* funkcia vráti pole (int) s parametrami počet znakov v súbore,
   počet znakov v najdlhšom riadku
   a počet riadkov
*/
int *parametre_suboru(int param[], char *path)
{
    FILE *fr;
    int dlzka = 0, min_dlzka = 0, max_dlzka = 0, pocet_riadkov = 0, c;

    /* získanie počtu znakov v súbore, počtu znakov v najdlhšom riadku
       a počtu riadkov */
    if ((fr = fopen(path, "r")) == NULL) { // otvorí súbor ak existuje
        printf("Subor %s sa nepodarilo otvorit.\n", path);
        exit(1);
    }
    while ((c = getc(fr)) != EOF) {
        dlzka++; // spočíta počet znakov v súbore
        min_dlzka++; // spočíta počet znakov v riadku
        if (c == '\n') {
            if (max_dlzka < min_dlzka) {
                max_dlzka = min_dlzka; // vyberie najdlhší riadok
                min_dlzka = 0; // vynuluje minminálnu dĺžku, aby sa mohla načítať nová
            }
             pocet_riadkov++; // spočíta počet riadkov za pomoci znaku '\n' - odriadkovanie
        }
    }
    fclose(fr); // uvoľní pamäť používanú pre prácu so súborom
    param[0] = dlzka;
    param[1] = max_dlzka;
    param[2] = pocet_riadkov;

    return param; // vráti pole s parametrami
}

int main(void)
{
    FILE *fr;

    int i, c, *p_param;
    char *pole, **p_pole;

    p_param = (int *) malloc(3 * sizeof(int)); // inicializuje dynamicky pole parametrov
    p_param = parametre_suboru(p_param, SUBOR); // vráti pole parametrov súboru
    // p_param[0] = dĺžka, [1] = maximálna dĺžka riadku, [2] = počet riadkov
    // dynamicky alokuje jednorozmerné pole pre všetky znaky súboru
    pole = (char *) malloc(p_param[0]); // p_param[0] - počet znakov v súbore
    /* dynamicky alokuje pole pointerov na riadky */
    for (i = 0; i < p_param[2]; i++) // p_param[2] - počet riadkov , teda počet pointerov na riadky
        p_pole = (char **) malloc(p_param[1]); // p_param[1] - max počet znakov v jednom riadku

    if ((fr = fopen(SUBOR, "r")) == NULL) { // otvorí súbor ak existuje
        printf("Subor %s sa nepodarilo otvorit.\n", SUBOR);
        exit(1);
    }

    /* naplní jednorozmerné pole obsahom súboru */
    i = 0;
    while ((c = getc(fr)) != EOF)
        pole[i++] = c;
    fclose(fr); // uvoľní pamäť používanú pre prácu so súborom

    /* rozdelí pole na pole pointerov na riadky za pomoci funkcie strtok */
    char oddelovac[] = "\n"; // každý riadok je zakončený znakom '\n'
    char *riadok;
    i = 0;
    riadok = strtok(pole, oddelovac);
    while (riadok != NULL) {
        p_pole[i++] = riadok;
        riadok = strtok(NULL, oddelovac);
    }

    for (i = 0; i < p_param[2]; i++){ // p_param - počet riadkov
        printf ("%s\n",p_pole[i]);
    }

    // uvolní pamäť používanú pre jednorozmerné pole znakov
    free(pole);
    // uvolní pamäť používanú pre dvojzormerné pole pointerov na riadky
    for (i = 0; i < p_param[2]; i++){ // p_param - počet riadkov
        free((void *) p_pole[i]);
    }
    free((void *) p_pole);
    // uvolní pamäť používanú pre jednorozmerné pole parametrov
    free(p_param);

    return 0;
}

Otestuj si to a prečítaj si komentáre.
Funguje to s akýmkoľvek textovým súborom.

Editováno 20.4.2014 16:13
Nahoru Odpovědět  +1 20.4.2014 16:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.