NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze – Lekce 9 - Textové řetězce v jazyce C podruhé - Práce se znaky

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
DarkCoder
Člen
Avatar
Odpovídá na Patrik Pastor
DarkCoder:25.8.2019 4:10

Funkce strchr() vrací ukazatel na první výskyt dolního bytu v řetězci, za předpokladu, že hledaný znak se v řetězci nachází. Není-li žádný nalezen, vrací se nulový ukazatel. Z tohoto důvodu nemůžeš vrácenou hodnotu ihned dereferencovat, pokud nevíš, jaká hodnota byla funkcí strchr() vrácena. Pokud by daný znak v řetězci nebyl, došlo by při dereferencování nulového ukazatele k chybě a program by tak spadnul. Proto musíš nejprve tento ukazatel otestovat.

Podívej na následující příklad. V něm mám nějaký řetězec, ve kterém chci najít první znak (v tomto případě X), vypsat jeho hodnotu a jeho adresu. Pokud existuje, zaměnit ho za znak Y a nakonec znovu vypsat řetězec.

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

int main(void){

        char text[] = "Pan X znovu uderil.";
        char *p = strchr(text, 'X');

        if (p) {
                printf("%c - %p\n", *p, p);
                *p = 'Y';
        }
        printf(text);

        return 0;
}

To nejpodstatnější na celém příkladu je to, že nejprve získám ukazatel a poté ho otestuji. V případě že znakový ukazatel je platný (má adresu), vypíši potřebné údaje a poté hodnotu znaku, kterou získám dereferencováním ukazatele, pozměním na novou. Nakonec vypíši řetězec na obrazovku.

Odpovědět
25.8.2019 4:10
"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:25.8.2019 9:58

chapu, takze je tam ten mezistupen, kdy overis, ze je poitlnter platny. a nemohla byt podminka neco jako if (p* != NULL) ...

Je NULL vubec legalni hodnota prazdne promenne? (to.je ale asi void, spis jestli muze byt NULL, jako chybejici hodnota, nebo tak neco)

 
Odpovědět
25.8.2019 9:58
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Patrik Pastor
DarkCoder:25.8.2019 12:28

To jsou ale naprosté základy které by si měl umět. Žádné if(p* != NULL) není!

Proměnná má vždy nějakou hodnotu (ať už garbage, 0, jinou), neexistuje žádná prázdná proměnná. Void jako datový typ bez hodnoty se používá u funkce která nevrací hodnotu, která nemá parametry, u obecného ukazatele.

Pro proměnnou platí:

int i;

if(i) je totéž co if(i != 0)
if(!i) je totéž co if(i == 0)

pro ukazatele platí:

int *p;

if(p) je totéž co if(p != NULL)
if(!p) je totéž co if(p == NULL)

Pro proměnnou pomocí ukazatele:

int i, *p=&i;

if(*p) je totéž co if(*p != 0)
if(!*p) je totéž co if(*p == 0)

Pokud něco nevíš a nesouvisí to s tématem článku, založ nové téma.

Pokud Ti odpovím na dotazy, označuj je jako řešením, umožníš mi tím koupit si prémiový článek a tak pomůžeš nejen sobě ale i ostatním, kteří potřebují poradit.

Odpovědět
+2
25.8.2019 12:28
"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:25.8.2019 18:43

no clanky by potrebovaly aktualizovat, protoze pokud toto jsou zaklady, potom to tady neni ani v 1\2\3 lekce, ktere tady povazujou za zaklady. Defaultnuti hodnoty datovych typu, by mohly byt zmineny

 
Odpovědět
25.8.2019 18:43
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Patrik Pastor
DarkCoder:25.8.2019 18:52

Toto zkrácení zápisu by mělo být uvedeno v článku o relačních operátorech a prvním článku o ukazatelích. Defaultní hodnoty datových typů by mělo být v článku o lokálních a globálních proměnných a ve specifikátorech paměťových tříd, konkrétně static. Podívej se zda-li tu něco takového je.

Odpovědět
25.8.2019 18:52
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Guláš
Člen
Avatar
Guláš:27.3.2020 8:08

for (i = 0; s[i] != '\0'; i++)
nerozumím co se tady píše, proč má cyklus procházet znaky z proměné s [ ] dokud bude neroven nule ??
nemělo by tam být , že je bude procházet dokud i < s[ ].

 
Odpovědět
27.3.2020 8:08
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Guláš
DarkCoder:27.3.2020 11:41

Každý řetězec v jazyce C je ukončen nullovým znakem '\0'. Toho lze využít pro traversování (provedení operace nad každým znakem) pole, aniž bychom museli určovat délku řetězce.

Podmínka for cyklu vysloveně říká, prováděj cyklus dokud i-tý prvek pole není nullový znak.

Obvykle je zápis for cyklu pro průchod celým řetězcem zapisován takto:

char s[] = "Mam rad retezce.";

for (int i = 0; s[i]; i++) putchar(s[i]);

Úryvek kódu vypíše obsah řetězce s po jednotlivých znacích.

Editováno 27.3.2020 11:42
Odpovědět
27.3.2020 11:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Guláš
Člen
Avatar
Odpovídá na DarkCoder
Guláš:27.3.2020 19:08

dobře ale proč tam je !=

 
Odpovědět
27.3.2020 19:08
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Guláš
DarkCoder:27.3.2020 19:15

Podmínka for cyklu vysloveně říká: Prováděj cyklus dokud i-tý prvek pole s není nullový znak.

Odpovědět
27.3.2020 19:15
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Guláš
Člen
Avatar
Guláš:29.3.2020 19:24

Aha, díky

 
Odpovědět
29.3.2020 19:24
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 35.