dobrý den,
prosím o radu, jsem začátečník v jazyce C:
#include <stdio.h>
int main()
{
unsigned int pokus;
scanf("%u", &pokus);
printf("%u", pokus);
return 0;
}
Jde mi o to, jak program zastavit pokud byl zadán znak místo čísla, ten se projeví jako číselná hodnota 0 což mi nevyhovuje.
Jde to nějak otestovat popřípadě jak? Je to součást hodin které se mají načíst v jednom číselném řetězci (hhmmss) - 123443.
děkuji za vaši radu
Fórum › C / C++
Test na zadání znaku
Skus nieco take..
#include <stdio.h>
#define TIME_SIZE 6
//funkcia testuje ci vsetky znaky v retazci
//su cisla (rozsah ASCII pre cisla je 48=0 az 57=9)
int isNumbers(const char* buf, unsigned int size)
{
int i;
for (i = 0; i < size; i++) {
if ( (buf[i] < 48) || (buf[i] > 57) ) {
return 0;
}
}
return 1;
}
int main()
{
char time[TIME_SIZE];
int ok;
//nacitas cisla ako retazec dlhy 6 znakov(hhmmss)
scanf("%s", time);
//funkcia otestuje ci vsetky znaky su cisla
ok = isNumbers(time, TIME_SIZE);
if (ok) {
printf("OK\n");
} else {
printf("Invalid\n");
}
return 0;
}
Inac ak potrebujes taketo zlozitejsie checkovacky tak sa pozri po kniznici PCRE na www.pcre.org Je to jednoducha kniznica na regularne vyrazy pre Cecko vid API na http://www.ugcs.caltech.edu/manuals/libs/pcre-6.4/pcreapi.html
díky moc za odpověď, nicméně nešlo by to nějak jednodušeji? něco v tomto stylu:
/*test na max. délku vstupu, pokračování předchozího programu z mého topicu*/
if ((pokus/1000000) > 0){
printf("chyba, zadej 6 mistne cislo");
return(1);
}
problém je, že když zadám písmena, tak si to převede na 0. viz můj topic
V Ccku nieje nic jednoduche. Aj taketo veci ktore by v inych jazykoc clovek vyriesil jednym riadkom sa v Cecku robia zlozitejsie. Inac sam si si odpovedal. Totizto ked zadas pismena, dostanes nulu. cize ak cislo nebude v intervale 100000 a 999999 je nevalidne. Mozno sa nechapeme ale nepotrebujes nieco take:
#include <stdio.h>
int main()
{
unsigned int pokus;
scanf("%u", &pokus);
if ((pokus > 100000) && (pokus < 999999)) {
printf("OK\n");
} else {
printf("Invalid\n");
}
return 0;
}
az na to, ze pri zadani napriklad 679jhksdf chyba nenastane...
ja by som sa skor uberal cestou getchar+ASCII, mozne je pouzit aj funkciu atoi a tak dalej, moznosti je viac a nemyslim ze ta vyssie uvedena je spravna...
Alebo si spravyt stavovy automat ktori bude akceptovat len postupnost cisel. Napr takyto:
:space: :digit:
+--->----+ +---->----+
| | | |
| | | | :space:
|+--<----+ |+---<----+ +--->---+
|| || | |
|| :digit: || :space: | |
S----->-------A--------->--------B---<---+
| | |
|:alpha: |:alpha: |:alpha:
| | |:digit:
+-->---E---<--+--------<---------+
|
S = pociatocny stav (neakceptuje)
E = loop/chybovy stav (neakceptuje)
A, B = akceptacny stav
//samozrejme nacitane cislice si ukladat
edit:
Niektore stavy sa mozu vynechat a vysledny kod moze vyzerat takto:
#include <cstdio>
#include <cstdlib>
#include <cctype>
bool string2unsigned(const char str[], unsigned &out){
enum State{ S, A, B};
State x = State::S;
for(const char *c = str; *c != '\0'; ++c)
switch(x){
case State::S:
if(isdigit(*c))x = State::A;
else if(isspace(*c))x = State::S ;
else return false;
break;
case State::A:
if(isdigit(*c))x = State::A;
else if(isspace(*c))x = State::B ;
else return false;
break;
case State::B:
if(isspace(*c))x = State::B;
else return false;
break;
}
if(x == State::S)return false;
sscanf(str, "%u", &out);
return true;
}
int main() {
unsigned i;
const char *str;
str = "123";
if(string2unsigned(str, i))printf("%u\n", i); //<<
else puts("chyba");
str = " 123aaa";
if(string2unsigned(str, i))printf("%u\n", i);
else puts("chyba"); //<<
str = " \t \n345 \t\n\n";
if(string2unsigned(str, i))printf("%u\n", i); //<<
else puts("chyba");
str = " 123 123";
if(string2unsigned(str, i))printf("%u\n", i);
else puts("chyba"); //<<
str = " \t \n";
if(string2unsigned(str, i))printf("%u\n", i);
else puts("chyba"); //<<
return EXIT_SUCCESS;
}
funkcia string2unsigned vrati true ak sa prevod podaril a prevedne cislo ulozi do out.
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
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C++ Automatické potvrzení vstupu po zadání jednoho znaku — založil Duong Manh Kien
MSSQL 2014 odeslání textu "test" a ne \"test\" — založil Jan Rücker
Ako na vyhladanie znaku/znakovresp.slov v nejakom value? + Ako na ma… — založil Lordest
Vysvětlení zadání... — založil Empty
Moderátoři diskuze