Diskuze: Pole řetězců (2D)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
#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)
Musíš použít pole? Pokud ne, dalo by se to uložit do struktury.
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;
}
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
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.
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á
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.
Zobrazeno 10 zpráv z 10.