Jak v C ošetřit vstupy pouze na čísla? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak v C ošetřit vstupy pouze na čísla? – C / C++ – Fórum – Programujte.comJak v C ošetřit vstupy pouze na čísla? – C / C++ – Fórum – Programujte.com

 

Ryan99
~ Anonymní uživatel
15 příspěvků
17. 3. 2015   #1
-
0
-

Dobrý den,

chtěl bych se zeptat na začátečnickou otázku, nikde se mi nedaří najít odpověď. Jak je možné ošetřit vstup pouze na čísla? Jde mi o to, aby při chybě (zadání znaku) program znovu vyzval k zadání čísla. Zkoušel jsem různé cykly, např.:

while((scanf("%g", &a) != 1)){
        printf("Znovu, musite zadavat pouze cisla!");
        }

při zadání čísla je to v pohodě, ale při zadání textu se to zacyklí, musím tu proměnnou zase nějak vymazat, nebo jak to upravit?

Díky

Nahlásit jako SPAM
IP: 88.100.30.–
17. 3. 2015   #2
-
0
-

narazí na první znak textu, ten nejde konvertovat na číslo. Vrátí  EOF ( aspoň pokud jsem správně pochopil dokumentaci ). To v cyklu opakuje. Řešení: v těle cyklu kromě výzvy k novému zadání musíš ze vstupu odstranit text, který tam zůstal.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:14e2:e2...–
KIIV
~ Moderátor
+43
God of flame
17. 3. 2015   #3
-
0
-

EOF vraci jen kdyz narazi na konec souboru. scanf vraci pocet uspesne nactenych parametru. Takze, kdyz vrati nulu, tak se nepovedlo nacist cislo.

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
17. 3. 2015   #4
-
0
-

#3 KIIV
If a reading error happens or the end-of-file is reached while reading, the proper indicator is set (feof or ferror). And, if either happens before any data could be successfully read, EOF is returned.

zdroj http://www.cplusplus.com/reference/cstdio/scanf/

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:14e2:e2...–
KIIV
~ Moderátor
+43
God of flame
17. 3. 2015   #5
-
0
-

 #4 hlucheucho
 

#include <stdio.h>

int main() {
  int test;
  printf("%d\n", scanf("%d",&test));
}

A vysledek:

Pismena misto cisel: 
> sdf
< 0   

> ^D  (ctrl+D)
< -1  (EOF)
Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
17. 3. 2015   #6
-
0
-

   

while((scanf("%g", &a) != 1)){
  printf("Znovu, musite zadavat pouze cisla!");
  scanf("%*s");
}

má to ale háček: pokud zadaný řetězec začíná na číslo, tak se zkonvertuje číselná část a textová tam zůstane.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:14e2:e2...–
17. 3. 2015   #7
-
0
-

   

float a;
char znak;
char char text[256];

for (scanf("%s", text); sscanf(text, "%g%c", &a, &znak) != 1; scanf("%s", text)) {
  printf("Znovu, musite zadavat pouze cisla!");
}

bere pouze čistý číselný vstup.

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:14e2:e2...–
Ryan99
~ Anonymní uživatel
15 příspěvků
18. 3. 2015   #8
-
0
-

Díky moc kluci, v Cčku se začínám učit tak doufám že neavdí že se tu objeví víc takových triviálních dotazů...

Nahlásit jako SPAM
IP: 88.100.30.–
Domii0
Duch
25. 11. 2015   #9
-
0
-

Ahoj, chtela jsem se zeptat, jak bys vysvetlil tvuj kod? :)

Nahlásit jako SPAM
IP: 147.175.137.–
26. 11. 2015   #10
-
0
-

#9 Domii
Jestli myslíš příspěvek #7, tak přečte vstup jako řetězec a zkouší ho konvertovat na float a znak. Funkce sscanf vrátí počet úspěšně konvertovaných položek:

Vrátí 0 (nulu) - řetězec začíná znakem, který nevyjadřuje float číslo, chybné zadání
Vrátí 1 - řetězec obsahuje jen znaky, které vyjadřují float číslo, toto číslo je uloženo v a. Správné zadání
Vrátí 2 - řetězec obsahuje znaky, které vyjadřují float číslo (uloží se do a) a ještě další znaky, které nevyjadřují float číslo. První z těchto znaků je v proměnné znak. I zde se jedná o chybné zadání.

Cyklus for zajistí opakovaný požadavek na zadání čísla dokud nebude správně zadáno.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Pavel Brouk
~ Anonymní uživatel
1 příspěvek
15. 1. 2018   #11
-
0
-

}#1 Ryan99 v mém programu jsem zkoušel to takto,

printf ("Zadej první číslo - );
while(scanf("%d",&a) == 0

{

printf("špatný vstup");
printf("zadejte znovu první číslo");
scanf("%d",&a);
getchar();
}

printf("zadej druhé číslo");
while(scanf("%d",&b)==0);

{

printf ("špatný vstup");'
printf ("Zadej druhé číslo znovu ");
scanf("%d",&b);
getchar();

}

Nahlásit jako SPAM
IP: 2a00:1028:8382:30b6:502d:...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 39 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý