Tak więc próbowałem znaleźć rozwiązanie tego problemu, ale mogę tylko znaleźć posty, w których brakuje nowego wiersza lub bajtu null w jednym z ciągów. Jestem prawie pewien, że tak nie jest.c - Strcmp nie zwraca 0 dla równych ciągów znaków
Korzystam z poniższej funkcji, aby porównać słowo z plikiem zawierającym listę słów z jednym słowem w każdym wierszu (słownik w funkcji). Oto kod:
int isWord(char * word,char * dictionary){
FILE *fp;
fp = fopen(dictionary,"r");
if(fp == NULL){
printf("error: dictionary cannot be opened\n");
return 0;
}
if(strlen(word)>17){
printf("error: word cannot be >16 characters\n");
return 0;
}
char longWord[18];
strcpy(longWord,word);
strcat(longWord,"\n");
char readValue[50] = "a\n";
while (fgets(readValue,50,fp) != NULL && strcmp(readValue,longWord) != 0){
printf("r:%sw:%s%d\n",readValue,longWord,strcmp(longWord,readValue));//this line is in for debugging
}
if(strcmp(readValue,longWord) == 0){
return 1;
}
else{
return 0;
}
}
Kod kompiluje bez błędów, a funkcja odczytuje plik słownika grzywny i wydrukuje listę słów, które pojawiają się tam. Problem, który mam, polega na tym, że nawet jeśli dwa ciągi są identyczne, strcmp nie zwraca wartości 0, więc funkcja zwróci wartość false dla dowolnego wejścia.
np uzyskać:
r:zymoscope
w:zymoscope
-3
Jakieś pomysły? Czuję, że brakuje mi czegoś oczywistego, ale nie mogłem znaleźć niczego w moich wyszukiwaniach.
Przypuszczam, że jesteś na komputerze z systemem Windows, które już odczytać pliku z zakończeń linii CRLF, i że nie oczyściłeś dokładnie końcówek. Istnieje różnica 3 między wartością "\ r" i "\ n" w wielu (większości) zestawach kodów. Ciekawe, że masz jedną 'printf()', drukującą wszystkie te dane, ale bez '\ n' w ciągu formatującym. Polegasz na nowych danych w danych, co wydaje się mało prawdopodobne. (Napisz funkcję drukowania bajtów w łańcuchu na heksach, wywołaj ją w każdym ciągu, zauważ różnicę.) –
Twoja kontrola długości również zakłada pojedynczy '\ n', możesz być wyłączony o jeden, jeśli' \ r \ n 'jest używany – Basic
Twój plik nigdy nie jest zamknięty. Wykonaj wszystkie możliwe kontrole * przed * otwarciem pliku. Zamknij po zakończeniu (lub w przypadku błędów). –