[#1] int main(int argc, char * argv[])
Użytkownik z konsoli wprowadza jakiś parametr. W jaki sposób sprawdzić czy parametr "argv[]" to cyfra czy liczba, przy założeniu że liczba ma mieć wartość z przedziału od 0 do 255.
[#2] Re: int main(int argc, char * argv[])

@ZED^lM, post #1

w argv masz zawsze stringi, wiec parsujesz tak jak kazdy ciag znakowy. Masz na przykład funkcję isdigit.

[#3] Re: int main(int argc, char * argv[])

@ZED^lM, post #1

#define BLAD 666

int wynik;


if(wynik=atoi(argv[ i ]))
{

;

}
else
{
if (argv[ i ][0]=='0')
wynik=0;
else
wynik=BLAD;
}


atoi zwraca liczbe ze stringa, jesli nie ma liczby to zwraca 0, w tym wypadku trzeba sprawdzic czy akurat ktos nie wprowadzil 0 jako argument



Ostatnia modyfikacja: 23.10.07 13:59



Ostatnia modyfikacja: 23.10.07 14:02
[#4] Re: int main(int argc, char * argv[])

@rzookol, post #3

"if(wynik=atoi(argv))"

a co to jest?:) jak juz to atoi(argv[1])

no i jeszcze "if (argv[0]=='0')"

pierwszy argument jest pod indeksem 1. zerowy to nazwa pliku wykonywalnego (przy uruchamianiu z konsoli).



Ostatnia modyfikacja: 23.10.07 14:00
[#5] Re: int main(int argc, char * argv[])

@kiero, post #4

cos mi PPA wycieło przy edycji :/, dziwne

dodane: aa, parser PPA zaczyna po [ i ] italikowanie dlatego w tekscie tego nie ma :) (a raczej nie było bo poprawilem)



Ostatnia modyfikacja: 23.10.07 14:05
[#6] Re: int main(int argc, char * argv[])

@kiero, post #4

jak juz to atoi(argv[1])

atoi()? chyba atol().
[#7] Re: int main(int argc, char * argv[])

@Phibrizzo, post #6

może być i atoi i atol, ale najlepiej strtol, bo mozna wyłapać błąd :)

[#8] Re: int main(int argc, char * argv[])

@ZED^lM, post #1

Witam,

Ja proponuje na dobry początek takie rozwiązanie.
int main( int argc, char* argv[] )
{
    const int SUCCESSFULY_CONVERTED_FIELDS = 1
    int i; /* parsowana liczba */

    /* 
     *  nie zapomnij sprawdzic czy argv[ 1 ] istnieje
     */

     if( SUCCESSFULY_CONVERTED_FIELDS == sscanf( argv[ 1 ], "%d", &i ) )
     {
           /* i = sparsowana liczba 
            * teraz możesz sprawdzić czy to cyfra  czy liczba
            */
      }

    /*
     * ...
     */
}

Rozwiązanie jest dobre ale parametry typu "41as" są rozpoznawane jako "41". Aby pozbyć się takich przypadków ( jeśli chcesz ) to trzeba dodać jeszcze jedną deklarację.
char c; /* wartownik poprawnosci konca parametru */

Pozostaje zmienić też kawałek
sscanf( argv[ 1 ], "%d", &i )

na
sscanf( argv[ 1], "%d%c", &i )

I wtedy parametry typu "1asd" nie będa brane pod uwagę. Warto też się zastanowić czy parametry typu "+12" powinny być parsowane czy uznane za błędne ( wtedy trzeba zmienić podejście i zrezygnować ze sscanf i korzystać ze isdigit ).

Pozdrawiam



Ostatnia modyfikacja: 24.10.07 08:27
[#9] Re: int main(int argc, char * argv[])

@asman, post #8

Czyżby nikt nie zauważył mojego babola w kodzie ? :D
W lini
sscanf( argv[ 1 ], "%d%c", &i );

jest okrytny babolek. Oczywiście powinno być
sscanf( argv[ 1 ], "%d%c", &i, &c );


[#10] Re: int main(int argc, char * argv[])

@asman, post #9

pewnie przez to, ze wszelkie *scanfy pomijam z zasady, ze wlasnie
mozna takie glupie bledy zrobic i kompilator tego nie wylapie.

[#11] Re: int main(int argc, char * argv[])

@Kaczus, post #10

Akurat ilosc argumentow dla funkcji typu sscanf i printf kompilator wylapuje. Dostaje sie warning w stylu "warning: too few arguments for format".

Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem