NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 4 - Dynamické textové řetězce a struktury v jazyce C

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Libor Šimo (libcosenior):20.11.2014 13:34

Chybička
scanf(" %20[^\n]s", &buffer);
;)

Odpovědět
20.11.2014 13:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Hartinger:20.11.2014 15:21

Díky, měla tam být samozřejmě velikost bufferu, opravil jsem to.

Odpovědět
20.11.2014 15:21
New kid back on the block with a R.I.P
Avatar
tomisoka
Tvůrce
Avatar
tomisoka:20.11.2014 17:39

Nemělo by se použít toto?

scanf(" %100[^\n]s", buffer);

Sice "&buffer" funguje taky, ale moc bych na to nespoléhal:

main.c:5:1: warning: format ‘%[^
’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[101]’ [-Wformat=]
 scanf(" %100[^\n]s", &buffer);
 
Odpovědět
20.11.2014 17:39
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na tomisoka
David Hartinger:20.11.2014 21:12

Jasně, pole je ukazatel, takže bez &, opraveno :)

Odpovědět
20.11.2014 21:12
New kid back on the block with a R.I.P
Avatar
rosatislav
Člen
Avatar
rosatislav:12.5.2018 17:53

Jen takový dotaz pro David Hartinger, nemělo by být zde:

UZIVATEL* p_karel = malloc(sizeof(UZIVATEL));

tohle?:

UZIVATEL* p_karel = (UZIVATEL*)malloc(sizeof(UZIVATEL));

a doplňující dotaz, když se předává struktura hodnotou, tak to znamená, že ono to zkopíruje i celé pole jmeno[51] či adresa[51]? tedy že vytvoří nové pole a tam nakopíruje všechny znaky z toho původního?

(aspoň mě to tak teda funguje a docela mě to vlastně překvapilo)

Děkuji za odpověď

Editováno 12.5.2018 17:54
 
Odpovědět
12.5.2018 17:53
Avatar
DarkCoder
Člen
Avatar
Odpovídá na rosatislav
DarkCoder:12.5.2018 18:14
  1. Ano
  2. Ano, při volání hodnotou je struktura předaná jako celek.
Odpovědět
12.5.2018 18:14
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na rosatislav
Martin Dráb:12.5.2018 21:57
  1. v C to, co mám zkušenost, překladače většinou přejdou, maximálně vyhodí varování. malloc vrací ukazatel, který je přiřazován do ukazatele (ač ne obecného). V C++ ti zápis bez explicitního přetypování vyhodí chybu, tam víc dbají na přesnost typů.
Odpovědět
12.5.2018 21:57
2 + 2 = 5 for extremely large values of 2
Avatar
Patrik Pastor:30.8.2019 15:47

Neni mi jasna jedna vec. Operator '->' data hodnotu nebo adresu promenne? V prikladu to neni zrejme, protoze jednou je to pouzito jako adresa: `strcpy(p_karel->jmeno, ...) a podruhe hodnota : printf("%s", p_uzivatel->jmeno). Co vlastne znamena '->'? A proc nepouzivala i u struktury staticke? Kdyz jsem mel prece napr:

typedef struct{
   char zelenina[10];
   char ovoce[10];
} PLODINA;

tak plodina mela atribut 'ovoce' - ale to je pole, takze jsem prece taky mel pointer jako PLODINA.ovoce - byl taky pointer na zacatek pole ovoce a mel jsem operator tecku, tak proc by pointer u dynamickeho pole mel mit '->'? (oba dva jsou pointery, v cem se tedy lisi, ze jim c-cko dava jinaci operatory pristupu)?

Dik za odpoved

 
Odpovědět
30.8.2019 15:47
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Patrik Pastor
DarkCoder:30.8.2019 17:27

To záleží dle typu proměnné. Pokud je prvkem struktury pole nebo řetězec (pole znaků), pak se jedná o adresu, v opačném případě se jedná o hodnotu. Pole se nikdy nepředávají hodnotou, vždy se předává ukazatel na pole. Proto první argument funkce strcpy() je ukazatel na pole. To co se předává pomocí printf() se specifikátorem formátu %s je ukazatel na pole.

char pole[] = "Test";

printf("%s\n", pole); // nebo l0pe
puts(pole);

-> je šipkový operátor, . je tečkový operátor. Pro zpřístupnění prvku struktury pomocí strukturové proměnné se použije tečkový operátor, pro zpřístupnění prvku struktury pomocí ukazatele se použije šipkový operátor. Tečkový operátor lze v jisté formě použít i pro ukazatelovou proměnnou, ale tato forma se nepoužívá. Pokud budeš dodržovat Maďarskou notaci pro proměnné, budeš vždy vědět kdy používat tečkový a kdy šipkový operátor.

Následující program ukazuje práci s prvky struktury pomocí strukturové a ukazatelové proměnné:

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

#define SIZENAME 30

struct sType {
        int x;
        char name[SIZENAME];
};

int main(void) {
        struct sType s, *ps = &s;

        s.x = 10;
        ps->x = 10;
        (*ps).x = 10;

        scanf("%d", &(s.x));
        printf("%d\n", s.x);

        scanf("%d", &(ps->x));
        printf("%d\n", ps->x);

        scanf("%d", &((*ps).x));
        printf("%d\n", (*ps).x);

        strcpy(s.name, "Patrik Pastor");
        puts(s.name);

        strcpy(ps->name, "Patrik Pastor");
        puts(ps->name);

        strcpy((*ps).name, "Patrik Pastor");
        puts((*ps).name);

        return 0;
}
Odpovědět
30.8.2019 17:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Patrik Pastor:30.8.2019 18:20

proc je zase vyhodnejsi pouzit funkci puts na output nez printf. A co je madarska notace :D to bych vazne necekal, ze zrovna tato zeme v IT bude navrhovat notace, staci kdyz slysim ten jejich jazyk :D nic proti madarum.

 
Odpovědět
30.8.2019 18:20
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 27.