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
Fórum › C / C++
Ošetření vstupu
![](img/forum_vlakno_help_vyreseno.png)
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á.
To Caken : zkus if( scanf("%d",&pocetR)){ if(pocetR>1 && pocetR<51) {}}
#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;
}
}
}
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;
}
}
}
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
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.
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
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?
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
![](img/forum_nove_psp_new.png)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
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
Ošetření vstupu. — založil Wades
Moderátoři diskuze