Skocz do zawartości

[C]Proszę o sprawdzenie kodu


gawan

Polecane posty

Witam wszystkich. Uczę się właśnie programować w C oraz C++ i mam problem z następującym kodem

 
#include <stdio.h>
#include <string.h>
#include <ctype.h>

char *slownik[][40] = {
               "komputer",     "to ja",
               "samochód",     "pojazd z silnikiem",
               "samolot",      "maszyna latająca",
               "telefon",      "maszyna komunikacyjna",
               "",""
               };

int main(void)
{
       char slowo[80], ch;
       char **p;

       do{
               puts("\nPodaj słowo: ");
               scanf("%s", slowo);
               p = (char **)slownik;

               do{
                       if(!strcmp(*p, slowo)){
                               puts("Znaczenie: ");
                               puts(*(p+1));
                               break;
                       }
                       if(!strcmp(*p, slowo)) break;
                       p=p+2;

               }while(*p);

               if(!*p) puts("Nie ma w słowniku");
               printf("Następne? (t/n)");
               scanf("%s", &ch);

       }while(toupper(ch)!='N');
       return 0;
}

 

Program się kompiluje. Problem polega na tym, że poprawnie działa tylko przy pierwszym wpisaniu słowa i tylko dla słowa pierwszego z listy lub dla słowa nie znajdującego się na liście.

Prawdopodobnie pomieszałem coś we wskaźnikach. Byłbym bardzo wdzięczny gdyby ktoś rzucił na to okiem i podpowiedział mi co jest nie tak.

Pozdrawiam.

 

Edit:

Doszedłem do wniosku, że zastosowane w tym prgramie warunki typu (*p) niestety nie działają poprawnie. Innymi słowy nie można napisać czegoś w rodzaju if(!*p) licząc, że w zależności od przekroczenia zakresu tablicy na którą wskazuje p wyrażenie przyjmie wartość 0 lub większą niż 0. Nie mam co do tego jeszcze pewności. Czy kotś może to potwierdzić i ewentualnie wyjaśnić mi w jaki sposób można stworzyć taki warunek.

Link do komentarza
Udostępnij na innych stronach

Dziwne, u mnie działa cały czas poprawnie...

CYTATPodaj słowo:

mortal

Nie ma w słowniku

Następne? (t/n)t

 

Podaj słowo:

komputer

Znaczenie:

to ja

Następne? (t/n)t

 

Podaj słowo:

samochód

Znaczenie:

pojazd z silnikiem

Następne? (t/n)t

 

Podaj słowo:

ko

Nie ma w słowniku

Następne? (t/n)t

 

Podaj słowo:

telefon

Znaczenie:

maszyna komunikacyjna

Następne? (t/n)

 

Kompilowane pod g++.

jason@jason-laptop:~$ g++ --version

g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5

Copyright © 2010 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Link do komentarza
Udostępnij na innych stronach

U mnie pętla do while z warunkiem (*p) nie działa.

Kompiluję w konsoli komedą: gcc -Wall p.c -o P.

 

W konsoli wygląda to u mnie tak:

Podaj słowo:

a

Nie ma w słowniku

Następne? (t/n)t

 

Podaj słowo:

komputer

Znaczenie:

to ja

Następne? (t/n)t

 

Podaj słowo:

samochód

Nie ma w słowniku

Następne? (t/n)t

 

Podaj słowo:

telefon

Nie ma w słowniku

Następne? (t/n) n

Link do komentarza
Udostępnij na innych stronach

Pod jakim systemem operacyjnym to uruchamiasz? O ile pamiętam, to jak pisałem programy konsolowe w C, to w windowsowej konsoli cuda się działy po przeniesieniu z Linuksa. Głównie przy wprowadzaniu danych scanf'em nie czyszcząc wejścia fflush'em. U mnie pod Ubuntu to działa tak jak wykleiłeś bez żadnych modyfikacji.

Link do komentarza
Udostępnij na innych stronach

Też mi to przyszło do głowy, ale niestety, pomijając dodatkowe wyrzucenie ostrzeżenia o niepoprawnym specyfikatorze typu, niczym się te dwie metody nie różnią.

No nic, coś muszę mieć tu siebie pomieszane. W każdym razie cieszę się, że ten program mimo wszystko działa jak należy.

Jeżeli ktoś ma jakiś pomysł co może być nie tak, to będę wdzięczny za podpowiedź. Jeżeli ja znajdę u siebie to coś, co powoduje wadliwe działanie warunku to też dam znać.

Dzięki za pomoc. Temat można uznać za zamknięty.

 

Edit:

To jeszcze raz ja.

Sprawdziłem ten program na jeszcze jednym systemie. Okazało się, że kompilator nie ma problemów z warunkiem. Natomiast z jakiegoś powodu nie radzi sobie ze strukturą tablicy. W przyszłości lepiej nie stosować takich dziwolongów ^^

Link do komentarza
Udostępnij na innych stronach

  • 2 weeks later...

Poza tym:

KODscanf("%s", slowo);slowo ma wielkość 80 - wpisz 120 znaków i zobacz co się stanie. ( To samo co przy użyciu gets(). ;)

KODscanf("%s", &ch);Uch... :)

 

Lepiej użyć fgets(stdin, 20, bufor) albo scanf("%20s", bufor). ;)

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...