gawan Napisano Styczeń 23, 2011 Zgłoś Share Napisano Styczeń 23, 2011 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 More sharing options...
Jason Napisano Styczeń 23, 2011 Zgłoś Share Napisano Styczeń 23, 2011 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++ --versiong++ (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 More sharing options...
gawan Napisano Styczeń 24, 2011 Autor Zgłoś Share Napisano Styczeń 24, 2011 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 More sharing options...
Jason Napisano Styczeń 24, 2011 Zgłoś Share Napisano Styczeń 24, 2011 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 More sharing options...
gawan Napisano Styczeń 24, 2011 Autor Zgłoś Share Napisano Styczeń 24, 2011 W tej chwili siedzę na debianie squeeze. Link do komentarza Udostępnij na innych stronach More sharing options...
Jason Napisano Styczeń 24, 2011 Zgłoś Share Napisano Styczeń 24, 2011 W tej chwili siedzę na debianie squeeze. To w takim razie spróbuj to skompilować w g++ zamiast gcc, bo ja to potraktowałem u siebie jako C++. Może C++ obsłuży takie konstrukcje inaczej Link do komentarza Udostępnij na innych stronach More sharing options...
gawan Napisano Styczeń 24, 2011 Autor Zgłoś Share Napisano Styczeń 24, 2011 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 More sharing options...
azra Napisano Luty 2, 2011 Zgłoś Share Napisano Luty 2, 2011 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.