NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Rozlišení čísel a písmen

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Levin
Člen
Avatar
Levin:21.4.2015 19:56

Ahoj,

řeším následující problém. Potřebuji načíst znaky, které zadá uživatel, např. itn3etwo2rk
Z toho by měl být výstup itnnnetwoork. Tzn. pokud je za znakem číslo, tak předchozí znak vytisknou x-krát.

Načtení řeším

while( c = getchar())

následně si znak uložím do pole, v cyklu mám podmínku na kontrolu znaku podle ascii tabulky, když splněno, tak scanf("%d" &i) čislo. Jenže problém je ten, že bych se potřeboval vrátit o jeden znak zpět, jelikož to čte až o znak dále. Např. uter33y, vystup uterrry. Ta jedna trojka mi zmizí a znak se nakopíruje jen 3x místo 33x. Díky za radu, která pomůže vyřešit tento problém :)

 
Odpovědět
21.4.2015 19:56
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Levin
David Novák:21.4.2015 20:12

Tak jeden znak se dá vrátit do bufferu pomocí ungetc.

Ale nechápu, k čemu scanf?? Bych to udělal tak, že budeš načítat znaky, vždy si budeš pamatovat jeden posledně načtený znak (ten budeš v případě čísla opakovat). Když narazíš na číslo (makro isdigit() z ctype.h), tak je začneš sázet do nějakého pole znaků. Když pak narazíš znovu na znak, tak to pole znaků zkonvertuješ na číslo (např. pomocí atoi - kontrola není třeba - v poli máš jen číslice) a uděláš for cyklus, který tolikrát vypíše (putchar()) ten poslední zapamatovaný znak.. ;)

Nahoru Odpovědět
21.4.2015 20:12
Chyba je mezi klávesnicí a židlí.
Avatar
Levin
Člen
Avatar
Levin:21.4.2015 21:40

Díky za radu, ta funkce ungetc mi vyřešila můj problém.

scanf tam mam proto, že mi pak načte rovnou celé číslo. Kdyby tam bylo 143546, tak ať to nečte po znaku, ale načte to rovnou najednou. Nemusím pak případně volat funkce na převod. Přijde mi, že mi to ušetří čas i paměť. Takhle mi stačí 1 pole.

 
Nahoru Odpovědět
21.4.2015 21:40
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Levin
David Novák:21.4.2015 21:49

až na to, že scanf je náročnější než to načíst po znacích a převést.. :D

Obecně.. scanf je jedna z největších prasáren v C.. Jelikož ten vstup různě parsuje a musí podporovat všechny možné a nemožné formáty, tak je to opravdu "parní mlátička" a pokud ti jde o efektivitu, tak rozhodně nepoužívat ;)

Nahoru Odpovědět
21.4.2015 21:49
Chyba je mezi klávesnicí a židlí.
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 4 zpráv z 4.