Test na zadání znaku – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Test na zadání znaku – C / C++ – Fórum – Programujte.comTest na zadání znaku – C / C++ – Fórum – Programujte.com

 

Inhibitor
~ Anonymní uživatel
3 příspěvky
9. 3. 2007   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
9. 3. 2007   #2
-
0
-

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

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Inhibitor
~ Anonymní uživatel
3 příspěvky
9. 3. 2007   #3
-
0
-

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

Nahlásit jako SPAM
IP: ...–
sn3d0
Věrný člen
9. 3. 2007   #4
-
0
-

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;
}

Nahlásit jako SPAM
IP: ...–
shutdown -h now
Inhibitor
~ Anonymní uživatel
3 příspěvky
9. 3. 2007   #5
-
0
-

tak ještě jedno řešení a to toto




if (scanf("%d",&pokus)!=1) chyba = 1;

if (chyba == 1){
printf("chyba");
return(1);
}



moc díky za všechny rady.

Nahlásit jako SPAM
IP: ...–
30. 3. 2012   #6
-
0
-

#5 Inhibitor

toto:

chyba = 1;

a

if(chyba == 1)

je tam zbytočné!

Stačí:

if (scanf("%d",&pokus)!=1) {

  printf("chyba");

  return(1);

}

Ináč sa musím poďakovať na nápad. Je to veľmi jednoduché (žiadne polia) a v tom je krása.  

Nahlásit jako SPAM
IP: 178.40.88.–
Samot10
~ Anonymní uživatel
26 příspěvků
30. 3. 2012   #7
-
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...

Nahlásit jako SPAM
IP: 2001:67c:1220:c1d0:8158:8...–
vitamin+8
Grafoman
30. 3. 2012   #8
-
0
-

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.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
31. 3. 2012   #9
-
0
-

#7 Samot10
"az na to, ze pri zadani napriklad 679jhksdf chyba nenastane..."

To som si všimol pri testovaní. Ale myslím, že pre moje účely stačí aj ten uvedený kód.

Tu: http://skolka-jazyka-c.freespace.sk/ to v škôlke stačí.  

Nahlásit jako SPAM
IP: 178.40.88.–
Samot10
~ Anonymní uživatel
26 příspěvků
31. 3. 2012   #10
-
+1
-
Zajímavé

ved v pohode, ja len vravim, ze su aj ine riesenia...a treba aj porozmyslat ako to chces spracovavat, ci sa ti bude lepsie robit s 6cifernym cislom alebo 2cifernym...

Nahlásit jako SPAM
IP: 2001:67c:1220:c1d0:e0ca:3...–
31. 3. 2012   #11
-
0
-

#10 Samot10
ďakujem veľmi pekne a ak by sa ti chcelo, mohol by si nám trošku pomôcť v škôlke.

Nahlásit jako SPAM
IP: 178.40.88.–
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, 13 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ý