Sprawdzenie czy const char * to liczba/slowo

0

Od paru godzin męczę się z taką powiedziałbym błahostką..

Powiedzmy, że mam trzy zmienne:

const char *a = test;
const char *b = "123";
const char *c = "-123";

W jaki sposób mam sprawdzić czy zmienna jest poprawna, czyli czy zawiera liczbę, a nie słowo? Próbowałem is_digit, ale przy ujemnej wywala błąd. Próbowałem też konwersji na string i skorzystanie z find_first_not_of ale wydaje mi się to rozwiązanie strasznie przekombinowane.

Ktoś coś? ;)

0

leć przez wszystkie elementy tego c stringa i sprawdzaj czy dany znak jest cyfrą lub minusem(tylko dla pierwszego znaku)

2

W jaki sposób mam sprawdzić czy zmienna jest poprawna (...)
Nie ma takiego określenia jak czy zmienna jest poprawna.

(...) czyli czy zawiera liczbę, a nie słowo?
Nie możesz powiedzieć czyli, ponieważ w żaden sposób nie wynika to z poprzedniego zdania, ani też nie jest oczywiste :-P

To tak odnośnie gramatyki, a wracając do problemu: najłatwiej napisać własną funkcję opartą właśnie o find_first_not_of - idąc za komentarzem do postu na SO: !s.empty() && s.find_first_not_of("0123456789") == std::string::npos + sprawdzanie czy pierwszy znak jest minusem (bądź plusem).

0

Sprawdź czy pierwszy znak jest minusem albo cyfrą, przez funkcję jednolinijkową return ((c=='-') || (c>=0 && c<='9))- analogicznie możesz napisać funkcję IsDigit. Potem pętla while(znak) ii sprawdzasz czy jest do liczba, jeżeli jest to idzie dalej jeżeli nie to break jakiś :p. Zwracanie sobie chyba wymyślisz.

6

Raczej sugerowałbym pójścia w innym kierunku:

#include <iostream>
#include <sstream>
using namespace std;

template<typename T> bool isNext(const char *str)
  {
   istringstream ss(str);
   T val;
   return (ss>>val)&&(ss.get()==EOF);
  }

int main()
  {
   cout<<isNext<int>("-12.34")<<endl;
   cout<<isNext<double>("-1.234E-1")<<endl;
   return 0;
  }

Bo prymitywne sprawdzenie s.find_first_not_of("0123456789") == std::string::npos natychmiast daje ciała jak tylko zastanowimy się o liczbach typu double, lub skomplikowanym typie użytkownika.

3

Zacznij od zdefiniowania czym jest dla ciebie liczba: czy całkowita czy rzeczywista, czy chcesz dopuszczać liczby np. szesnastkowe, co ma być separatorem części ułamkowej i czy ma to zależeć od ustawień systemowych, ...

0

Mowa o liczbach całkowitych. Rozwiązanie _13th_Dragon spisuje się znakomicie. :) Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1