Portál AbcLinuxu, 10. května 2025 03:25

Dotaz: scanf a C

20.5.2005 09:34 ssil | skóre: 15
scanf a C
Přečteno: 214×
Odpovědět | Admin
Při načítání z klávesnice jsem narazil na to, že pokud nejdříve načítám znak a pak číslo (scanf ("%c", &zn) a později scanf ("%d", &i)) je to bez problémů, ale pokud nejdřív načtu číslo, znak se už nenačte. To je skutečnost s níž je třeba počítat, nebo dělám něco blbě.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.5.2005 09:48 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podle toho, co je to za znak. Pokud je to třeba číslice, vůbec bych se nedivil ;-)
20.5.2005 09:58 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
Ale jinak děláš něco blbě. Spusť
scanf("%d", &i);
scanf("%c", &c);
printf("[%d][%c]\n", i, c);
a napiš 12345x. Vypíše to [12345][x].
20.5.2005 10:33 ssil | skóre: 15
Rozbalit Rozbalit vše Re: scanf a C
Tak tohle funguje, ale už třeba 12345 x nefunguje. Přitom %c by mělo zaručit načtení i bílých znaků takže jsem očekával výpis [12345][ x]. Taky pokus, kdy jsem mezi scanf dal třeba tisk načtených čísel, byl neúspěšný.
20.5.2005 10:36 0
Rozbalit Rozbalit vše Re: scanf a C
%c nacte jeden znak nasledujici za cislem(tedy ve tvem pripade mezeru), zkus misto toho pouzit %*c%c, nebo %s do stringu.
20.5.2005 11:17 ssil | skóre: 15
Rozbalit Rozbalit vše Re: scanf a C
S tím %*c%c mám zcela nesmyslné výsledky a s %s mi to hlásí neoprávněný přístup do paměti SIGSEGV. Nějaké nápady?
20.5.2005 11:51 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: scanf a C
Naalokovat paměť pro ten řetězec :-) Jestli to chceš mít i s whitespace, tak mě napadá jedině
int i; char space[81], word[81];

space[sizeof(space)-1] = 0;
word[sizeof(space)-1] = 0;
scanf("%d%80[ \n\t]%80s", &i, space, word);
printf("[%d][%s%s]\n", i, space, word);
Nebo napiš co chceš... %c načte pevný počet znaků.
20.5.2005 11:57 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: scanf a C
Blbnu, to nulování posledního bajtu tam není potřeba, to jsem zkoušel %c.
20.5.2005 12:01 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
Nebo použít GNU libc a "%as", který alokuje dostatečně velký string sám...

Ale stejně nechápu úvodní představu, že %c načte více než jeden znak.
20.5.2005 11:57 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
The `%c' conversion is the simplest: it matches a fixed number of characters, always. The maximum field width says how many characters to read; if you don't specify the maximum, the default is 1. This conversion doesn't append a null character to the end of the text it reads. It also does not skip over initial whitespace characters.

Takže žádné bílé znaky nenačítá. Použij "%1s", ten bílé znaky přeskakuje.

Za zegfaulty a divné chování může to, že nečteš dokumentaci a nedáváš tomu správné argumenty.
20.5.2005 11:58 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
s/nenačítá/nepřeskakuje/

Načítá právě jakýkoli jeden znak, včetně bílého.
20.5.2005 12:31 ssil | skóre: 15
Rozbalit Rozbalit vše Re: scanf a C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak jsem si ujasnil, že %c načítá jen jeden znak a že jde načíst číslo, načíst znak a pak to teprve vytisknout. Ale vrátím se k původní otázce. Načtu znak, vytisknu jej, načtu číslo, vytisknu jej. Ale načtu číslo, vytisknu jej, chci načíst znak, ale z následujícího tisku zjišťuju, že se nenačetl.
20.5.2005 12:40 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: scanf a C
Ne.
scanf("%d", &i);
printf("[%d]\n", i);
scanf("%c", &c);
printf("[%c]\n", c);
Funguje úplně stejně jako první příklad.

Nejspíš opět načítáš jiný znak, než si myslíš, že načítáš.
20.5.2005 16:53 ssil | skóre: 15
Rozbalit Rozbalit vše Re: scanf a C
Bohužel, u mě to nefunguje. Napíšu číslo, dám enter a ono to napíše to číslo do hranatých závorek a už to na nic nečeká, vypíše to ty další hranaté závorky a navíc každou na nový řádek. Výsledek pak vypadá takto:
45
[45]
[
]
20.5.2005 17:04 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: scanf a C
Ten enter je taky znak.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.