Ošetření vstupu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ošetření vstupu – C / C++ – Fórum – Programujte.comOšetření vstupu – C / C++ – Fórum – Programujte.com

 

Caken
~ Anonymní uživatel
7 příspěvků
9. 4. 2011   #1
-
0
-

Zdravím,
potřeboval bych pomoci s následujícím problémem:

Uživatel zadá číslo z klávesnice, které musí být v rozsahu 2-50 včetně, pokud vloží cokoliv jiného (jiné číslo než z rozsahu, znak,...), tak musí opakovat svojí volbu. V případě vložení správného čísla, se číslo uloží do proměnné.

Díky za pomoc

Nahlásit jako SPAM
IP: 81.201.56.–
crAzY^
~ Moderátor
+10
Grafoman
9. 4. 2011   #2
-
0
-

do{ }while()

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Caken
~ Anonymní uživatel
7 příspěvků
9. 4. 2011   #3
-
0
-

Do a while je sice fajn, ale jenom s touhle radou to nevyřeším. Původně jsem měl napsáno tohle:

printf("Zadejte pocet radku (min. 2, max. 50): ");                                               

while(1){
scanf("%d",&pocetR);
if(pocetR>1 && pocetR<51)
{
break;
}
printf("Spatne zadany pocet radku! Opakujte volbu.\nZadejte pocet radku (min. 2, max. 50): ");
}


To samozřejmě funguje do té doby, než někdo vloží něco jiného než číslo typu int. Potřeboval bych tohle nějak upravit, aby to potom fungovalo jak má.

Nahlásit jako SPAM
IP: 81.201.56.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
9. 4. 2011   #4
-
0
-

To Caken : zkus if( scanf("%d",&pocetR)){ if(pocetR>1 && pocetR<51) {}}

Nahlásit jako SPAM
IP: 82.99.180.–
Caken
~ Anonymní uživatel
7 příspěvků
9. 4. 2011   #5
-
0
-

To Anonymní uživatel :
To mi nefunguje, pokud to takhle změním a zadám nějaký písmeno, tak se mi to zůstane zacyklené.

Nahlásit jako SPAM
IP: 81.201.56.–
KIIV
~ Moderátor
+43
God of flame
9. 4. 2011   #6
-
0
-

To Caken : tak se zbav pismenka

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Caken
~ Anonymní uživatel
7 příspěvků
9. 4. 2011   #7
-
0
-

To KIIV : Kdybych věděl jak to ošetřit, tak nepíšu sem :smile1:

Nahlásit jako SPAM
IP: 81.201.56.–
KIIV
~ Moderátor
+43
God of flame
9. 4. 2011   #8
-
0
-

To Caken : kdyz se ti nepovede nacist cislo, tak nezvladnes nacist znak ?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
pakr93
~ Anonymní uživatel
19 příspěvků
9. 4. 2011   #9
-
0
-

#include <stdio.h>

int main()
{
printf( "Zadejte desetinne cislo v intervalu od 2 do 50 : \n" );

int cislo;

while( 1 )
{
scanf( "%d", &cislo );

if( cislo <= 50 && cislo >=2 )
printf ( "Zadali jste : %d", cislo );
else {
printf( "Musite zadat cislo v intervalu od 2 do 50 !" );
continue;
}
}
}

Nahlásit jako SPAM
IP: 81.201.60.–
Thomasso0
Newbie
9. 4. 2011   #10
-
0
-

Na ošetření, že to není znak, bych použil knihovnu <ctype.h> a následně funkci isdigit(x);

Nahlásit jako SPAM
IP: 80.188.117.–
pakr93
~ Anonymní uživatel
19 příspěvků
9. 4. 2011   #11
-
0
-

Tady je to v c++ :

Akorat nevim proc mi program pri zadani neciselneho vstupu zacykli.
vstup jsem vymazal pomoci metody clear ...

#include <iostream>
#include <ctype.h>

int main()
{
std::cout << "Zadejte desetinne cislo v intervalu od 2 do 50 : " << std::endl;

int cislo;

while( 1 )
{
std::cin >> cislo;

if( cislo <= 50 && cislo >=2 )
std::cout << "Zadali jste : " << cislo << std::endl;
else if( !isalnum( cislo ) ) {
std::cout << "Vami zadany znak neni cislo !" << std::endl;
std::cin.clear();
continue;
}
else {
std::cout << "Musite zadat cislo v intervalu od 2 do 50 !" << std::endl;
continue;
}
}
}

Nahlásit jako SPAM
IP: 81.201.60.–
KIIV
~ Moderátor
+43
God of flame
9. 4. 2011   #12
-
0
-

To pakr93 : protoze se prekvapive nastavi priznak "neuspech" a dokud se ho nezbavis tak uz se nic dalsiho nenacte

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
crAzY^
~ Moderátor
+10
Grafoman
9. 4. 2011   #13
-
0
-

To pakr93 : metoda clear ti právě smaže pouze ten příznak "neúspěch" (o kterém psal KIIV), ale navstupu ti stále ten znak zůstane...

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Caken
~ Anonymní uživatel
7 příspěvků
11. 4. 2011   #14
-
0
-

To crAzY^ :
Jak se tedy zbavim toho co je na vstupu a nechám uživatele zadat hodnotu znovu?

Nahlásit jako SPAM
IP: 81.201.56.–
crAzY^
~ Moderátor
+10
Grafoman
11. 4. 2011   #15
-
0
-

To Caken : jednoduše... někam to načti...



string trash;
cin >>trash;
cin.clear();

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
Caken
~ Anonymní uživatel
7 příspěvků
12. 4. 2011   #16
-
0
-

Akorát, tohle asi funguje jen na C++ ne? Já bych to potřeboval na klasické C. A ještě bych potřeboval - ošetří mi to např. když dám vstup 5a? nebo dejme tomu a5? Aby to obojí vyhodnotilo jako chybu? Jak to popř. upravit? Díky

Nahlásit jako SPAM
IP: 81.201.56.–
Grungy0
Super člen
12. 4. 2011   #17
-
0
-

Nenačítavaj od užívatela vstup v podobe čísla, ale v podobe reťazca znakov

char vstup[50]={0};

scanf("%s", vstup)

Prejdi celý reťazec a skontroluj či sú všetky znaky reťazca číslice, ak nie tak vyhoď hlášku, že zadaný vstup je neplatný.
Ak sú všetky číslice tak pomocou atoi() zmeň reťazec na číslo.

Je to síce dlhšie, ale jednoduché a nemusíš riešiť či ti v buffri niečo ešte ostalo.

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 4. 2011   #18
-
0
-

To Caken :
Standardní postup:
Opakovat
Načíst vstup jako řetězec.
Převést řetězec na číslo odpovídající funkcí (procedurou)
V případě, že převodní funkce vrátí chybu při převodu, upozornit uživatele.
Skončit opakování jen pokud převod proběhl bez chyby

Nahlásit jako SPAM
IP: 88.103.236.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
12. 4. 2011   #19
-
0
-

To JoDiK :
Zkusil jsem fci atoi, jenže tam je ten zádrhel, že když uživatel zadá 0, tak to fce atoi vyhodnotí taky jako chybu... a strtol nebo strtod nevím jak správně použít...
Když budu mít

printf("Dolni mez: ");        

scanf("%s",&vstup);
dm = strtol(vstup,&error,10);


Tak jakou podmínku, popř. do jakého cyklu a s jakou podmínkou to musím dát, aby mi to fungovalo tak jak má? Tedy jakékoliv celé číslo je OK, cokoliv jiného ne?

Nahlásit jako SPAM
IP: 81.201.56.–
Caken
~ Anonymní uživatel
7 příspěvků
12. 4. 2011   #20
-
0
-

Tak nakonec se mi to povedlo, po chvíli hledání jsem našel co jsem potřeboval, podmínku jsem tam dal tuhle i

f (*error == '\0') break;


Díky všem za pomoc :smile1:

Nahlásit jako SPAM
IP: 81.201.56.–
Grungy0
Super člen
12. 4. 2011   #21
-
0
-

To Anonymní uživatel :
Tak po prvé ten ampersand(&) vo funkcii scanf() zmaž, vstup už sám o sebe je ukazovateľ na začiatok pola znakov tak netreba ešte referenciu, preto tam máš asi tú chybu

Po druhé ten reťazec musíš najprv overiť či sa v ňom nachádzajú iba čísla a potom až použiť atoi() teda

 int dobryVstup=1;

for(int i=0; i<strlen(vstup); i++)
if(!(vstup[i]=>'0' && vstup[i]<='9')) dobryVstup=0;

if(dobryVstup) nacitaneCislo = atoi(vstup);

nepamätám si už ako funguje scanf presne a či problém ešte nebude s ukončovacím znakom '\0' alebo so znakom novy riadok '\n', tak si to otestuj pre istotu

Nahlásit jako SPAM
IP: 158.193.84.–
Prvý náznak hlúposti, je pocit geniality.
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, 56 hostů

Podobná vlákna

Ošetření vstupů — založil vollf82

Ošetření vstupu. — založil jisla

Ošetření vstupu — založil Troy585

Ošetření vstupu — založil Erlesh

Osetreni vstupu — založil Prometheus

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ý