Diskuze: Pole řetězců (2D)
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 10 zpráv z 10.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
