IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 4. diel - Dynamické textové reťazce a štruktúry v jazyku C

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

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

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

Odpovedať
20.11.2014 13:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá 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.

Odpovedať
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);
 
Odpovedať
20.11.2014 17:39
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na tomisoka
David Hartinger:20.11.2014 21:12

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

Odpovedať
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ěď

Editované 12.5.2018 17:54
 
Odpovedať
12.5.2018 17:53
Avatar
DarkCoder
Člen
Avatar
Odpovedá na rosatislav
DarkCoder:12.5.2018 18:14
  1. Ano
  2. Ano, při volání hodnotou je struktura předaná jako celek.
Odpovedať
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
Odpovedá 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ů.
Odpovedať
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

 
Odpovedať
30.8.2019 15:47
Avatar
DarkCoder
Člen
Avatar
Odpovedá 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;
}
Odpovedať
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
Odpovedá 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.

 
Odpovedať
30.8.2019 18:20
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!