Skocz do zawartości

Kłopot Z C


tomcio15

Rekomendowane odpowiedzi

Uczę się języka C i swoje pierwsze programy pisze pod Linuksem :)

Wszystko było dobrze do rozdziału "Przekazywanie parametrów do programu przez polecenie":

 

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("/*\nLiczba opcji: %d\nZmienna: %s\n*/\n", argc, argv[1]);
    switch (argv[1][1])
    {
 case '?':
     printf("\nBrak pomocy.\n");
     break;

 default:
     printf("\nNieznany błąd!\n");
     break;
    }
    return 0;
}

 

A taki jest wynik wykonania programu:

 

[tomcio@localhost 2]$ ./program ?

/*

Liczba opcji: 2

Zmienna: ?

*/

 

Nieznany błąd!

[tomcio@localhost 2]$

 

Co jest z moim programem nie tak?!

Odnośnik do komentarza
Udostępnij na innych stronach

Wg mnie "nie trafiasz" w odpowiedni parametr.

Drobna poprawka polegalaby na zmianie:

 

switch (argv[1][1])

 

na

 

switch (argv[1][0])

 

i u mnie wszystko dziala. Chyba zgodnie z Twoimi oczekiwaniami :)

 

Z kolei ja mam pytanie, jak sobie radzicie z "brakiem (?)" w (_linuxie_ → Linuksie) ORT niektorych bibliotek.

Zdaza sie czasami ze przeklejenie kodu programu spod windowsa powoduje blad cytuje z pamieci: nie moze otworzyc pliku xxx.h?

Czy ktos zna odpowiedniki najpotrzebniejszych bibliotek?

Odnośnik do komentarza
Udostępnij na innych stronach

-ciach-

int main(int argc, char *argv[])

-ciach-

switch (argv[1][1])

-ciach-

 

1.

do switch przekazuje sie wartosci typu int a argv jest wskaznikiem do zmiennej typu char

(wiec lepiej zrob najpierw rzutowanie, lub uzyj odpowiedniej funkcji do przeksztalcenia na typ int)

 

2. argv[1][1] ? troche glupie...

argv[0] - nazwa programu

argv[1] - pierwsza zmienna

argv[2] - druga zmienna itd....

 

wiec jesli chcesz uruchamiac program np tak:

program 10 (gdzie 10 to zmienna, to musisz argv[1] - rzutowac na typ int, ktorego wymaga switch )

 

taka jest konstrukcja jezyka

Odnośnik do komentarza
Udostępnij na innych stronach

aha, czyli swith nie współgra z typem char?

ok, a mam jeszce takie pytanko:

argv[0] to nazwa programu, a argv[1] to pierwsza opcja tal?

i zrobiłem takie coś (to tylko wycinek z programu):

/*
 uruchomiłem program poleceniem ./program abc
*/
printf("opcja pierwsza %s\n", argv[1]);
char x = 'abc';
if(argv[1] == x)
{
   printf("Działa");
}
else
{
   printf("Nie działa");
}

A wynik działania wygląda tak:

 

opcja pierwsza: abc

Nie działa

 

dlaczego (_niedziała_ → nie działa) ORT porówenacie łańcuchów w konstrukcji if?

przecież obydwa mają typ char?

Odnośnik do komentarza
Udostępnij na innych stronach

1. piszesz w C czy w C++?

bo jesli w C to definicje powinny byc na samymn poczatku

 

2.

ta konstrukcja jest zla:

char x = 'abc';

bo typ char to jest pojedynczy znak, wiec jesli chcesz miec lanuch to tak:

 

char *x="abc"; (wskaznikiem)

albo tak:

char x[]="abc"; (tablica)

 

i cos takiego:

char x[]="abc";

to nie jest to samo co:

char x[]='abc';

 

(pierwsza tablica bedzie miec 4 elementy bo 4 jest znak '/0', a druga tablica 3 elementy bez znaku kopnca tablicy);

 

3.

if(argv[1] == x)

w Twoim programie, x jes typem char a argc jest wskaznikiem do typu char,

wiec powinienes porownac to na co ten wskaznik wskazuje i pamietaj o zgodnosci porownywanych typow:

char *x="abc";
...
if(*argv[1] == *x)
...

 

4.

jesli nie chcesz stosowac wskaznikow, mozesz uzyc stringow (czyli tablicy znakowej char x[]="abc")

 

do porownywania stringow nie uzywa sie takiego porownania == tylko funkcji strcmp z biblioteki string.h

 

 

5. PS

dawno nic nie pisałem, ale

int main(int argc, char *argv[])

czy przypadkiem nie powinno byc tak:

int main(int argc, char **argv[]) ?

Odnośnik do komentarza
Udostępnij na innych stronach

Wszystko już napisał mynus, dodam tylko że char współgra ze switch tylko przechowywany typ musi sie zgadzać z przekazaną zawartością do zmiennej znakowej bądz tablicy string, zapis char x='abc' jest niedopuszczalny!! :shock:

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...