Sprawdzenie czy const char * to liczba/slowo

Odpowiedz Nowy wątek
2016-03-06 22:56
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ś? ;)

Pozostało 580 znaków

2016-03-06 23:00
0

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


Programuje i programuje ,przychodzi człowiek "o niższej inteligencji" i rok pracy zmarnowany

Pozostało 580 znaków

2016-03-06 23:02
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).


edytowany 1x, ostatnio: Patryk27, 2016-03-06 23:04

Pozostało 580 znaków

2016-03-06 23:06
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.

isdigit() nie trzeba pisać już jest w &lt;cctype&gt; - _13th_Dragon 2016-03-06 23:18

Pozostało 580 znaków

2016-03-06 23:17

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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Może nazwa isValueOf byłaby bardziej odpowiednia. - _13th_Dragon 2016-03-06 23:22

Pozostało 580 znaków

2016-03-07 00:30
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, ...

Dołączam z dodatkowymi pytaniami ... czy zespolona to też liczba? A tessarin? A kwaternion? - _13th_Dragon 2016-03-07 00:41
@_13th_Dragon: nie popadajmy w absurdyzm. akurat pytania które zadałem są uzasadnione. - Azarien 2016-03-07 02:04
To nie był sarkazm, liczby zespolone są w standardzie, też są liczbami, więc ma sens rozważać. Zresztą to co przetoczyłem wyżej będzie pasować, tak samo jak inne typy użytkownika. - _13th_Dragon 2016-03-07 07:59

Pozostało 580 znaków

2016-03-07 08:15
0

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

edytowany 1x, ostatnio: maniek123, 2016-03-07 08:15

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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