Zdravím, začínám s programováním a mám malý problém - potřeboval bych nějak ošetřit, zda je v řetězci (argv[2]) zadané číslo, abych ho mohl korektně načíst do proměnné typu double (používám fci atof()). Prostě, aby, když uživatel zadá do parametru nějaký nesmysl, co není číslo (třeba "45r0"), to třeba vyhodilo nějakou chybovou hlášku. Napadlo mě to v cyklu ošetřovat na znaky '0' až '9' a '.' a 'e' pro desetinnou tečku a zápis v exponencionálním tvaru. To mi přijde ale dost nešťastné řešení. Nenapadá někoho něco lepšího? Díky!
Fórum › C / C++
Správné ošetření čísla
nebo takto:
#include <stdio.h>
#include <ctype.h>//pro pouziti fce isdigit() nutné!!
int main ()
{
char a[] = "12g";
for(int i = 0; i < sizeof(a) - 1; i++)
{
if(isdigit(a[i]) ? printf("cislice\n") : printf("neni cislice\n"));
}
while(getchar() != '\n');
getchar();
return 0;
}
KIIV napsal:
no jde pouzit i sscanf() ... tadle funkce vraci pocet nactenych promennych (spravne nactenych)
jak presne to myslis? nevim jak spravne to pouzit... funkce mi vraci nulu jen kdyz retezec ktery chci prevadet zacina pismenem, pokud ale prevadim takovyto retezec napr. 12XDG22.011, tak vysledek je 12 a funkce vrati 1, tedy ze spravne prevedla.. da se to nejak upravit, aby mi to hodilo chybu i kdyz narazi na cislo nekde uvnitr retezce?
#include <iostream>
#include <cstdlib>
#include <exception>
double GetDouble(const char *strNumber) throw(std::runtime_error)
{
char *pErr = 0;
// fce strtod pouzije pErr k iteraci stringem
// a pokud dojde k chy pErr ukazuje na misto kde
// ve stringu uz nejsou cisla, pokud je
// vse OK pErr MUSI ukazovat na konec retezce tedy
// na znak '\0'
double dValue = ::strtod(strNumber, &pErr);
// test zda-li nedoslo k chybe
if( pErr && *pErr )
throw std::runtime_error("Neni cislo");
return dValue;
}
int main()
{
// Test
static const char* szTestArray[] =
{
"123456.56",
"er12345.cosi",
"124er.56",
"12345.78uiyk"
};
int iCount = sizeof(szTestArray) / sizeof(szTestArray[0]); // OK pole pointeru
for( int i = 0; i < iCount; ++i )
{
try
{
double dNum = GetDouble(szTestArray[i]);
std::cout << "Uspesna konverze: " << dNum << std::endl;
}
catch(const std::exception& e)
{
std::cerr << e.what() << std::endl;
}
}
return 0;
}
jinak http://www.linuxsoft.cz/article.php?id_article=590
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 66 hostů
Podobná vlákna
Ošetření nuly a zaporného čísla — založil M.CH.
Ošetření vstupů- jen kladná čísla z intervalu — založil Pajda
Je to spravne — založil janek
Je to spravne ? — založil koudis
Moderátoři diskuze