2016-07-31 20 views
1

Ich bin neu hier und das ist meine erste Frage.strstr Funktion nicht zurück NULL

Ich habe bereits nach diesem Problem gesucht, aber nichts von dieser Art finden. Also hier geht es.

Ich schreibe ein Menü-basiertes Programm für eine Name-Datenbank, mit 2D-Array von Zeichen. unten ist meine Hauptfunktion.

int main(void) 
{ 
    char name[MAX][25] = { 0 }; 
    char choice; 

    while (1) { 
     printf("******************menu****************\n"); 
     printf("i: input\n"); 
     printf("p: print\n"); 
     printf("f: find\n"); 
     printf("d: delete\n"); 
     printf("s: sort\n"); 
     printf("e: edit\n"); 
     printf("q: quit\n"); 
     printf("**************************************\n\n"); 
     printf("Enter your choice: "); 
     scanf(" %c", &choice); 
     getchar(); 

     switch (choice) { 
      case 'i': 
       input(name); 
       break; 
      case 'p': 
       print(name); 
       break; 
      case 'f': 
       find(name); 
       break; 
      case 'q': 
       return 0; 
      default: 
       printf("Invalid choice\n"); 
     } 
    } 
} 

Eingabe und Druckfunktion funktioniert gut, aber ich habe ein Problem in der Funktion finden. Hier ist es.

void find(char (*p)[25]) 
{ 
    int i; 
    char str[25]; 

    if (count == 0) { 
     printf("Empty database\n"); 
     return; 
    } 

    printf("Enter name to search: "); 
    fgets(str, 25, stdin); 
    str[strlen(str) - 1] = 0; //Removing new line character at the end of string. 

    for (i = 0; i < count; i++) { 
     if (strstr(p[i], str) != NULL); //Breaking the loop, when first occurence is found among all the names. 
     break; 
    } 

    if (i == count) { 

     printf("Not found\n"); // if loop is not terminated by "break" statement, 
     // that means strstr returned NULL for all names. 
     return; 
    } 

    printf("Names matching with %s\n", str); 

    for (i = 0; i < count; i++) { 

     if (strstr(p[i], str) != NULL); // Again looping to print all the matching names. 
     puts(p[i]); 
    } 
} 

count ist eine globale Variable hier, die in Eingabefunktion erhöht wird. Die strstr Funktion gibt immer True zurück, auch wenn ich einen Kauderwelschnamen übergebe. Ich benutze ubuntu 16.04 gcc 5.3.1

Ich habe versucht, mit einem Breakpoint bei strstr debuggen, empfängt es beide die Zeichenfolgen richtig, aber immer den Zeiger auf Heuhaufen zurück.

53 ../string/strstr.c: Keine solche Datei oder Verzeichnis.

Haystack ist "Imtiyaz" und Nadel ist "abcd"

und hier ist, was es gibt.

find (p=0x7fffffffdcb0) at name_data.c:126 

Ich verstehe nicht, was hier falsch läuft, ist es von meiner Seite?

und eine weitere Sache, zuvor habe ich versucht mit strcasestr(), aber Compiler wirft eine Warnung "implizite Deklaration", obwohl ich <string.h> ordnungsgemäß enthalten.

bitte helfen Sie mir.

Edit: Ok Freunde, ich werde die Eingabe-und Druckfunktion auch zeigen, damit Sie Menschen mein Programm richtig analysieren. Was übrigens gut funktioniert.

void input(char (*p)[25]) 
{ 
    if (count == MAX) { 
     printf("Memory full\n"); 
     return; 
    } 

    printf("Enter name: "); 

    fgets(p[count], 25, stdin); 
    p[count][strlen(p[count]) - 1] = 0; //Removing the new line character at the end of string. 
    count++; 
} 

void print(char (*p)[25]) 
{ 
    int i; 

    if (count == 0) { 
     printf("Empty database\n"); 
     return; 
    } 

    printf("********************************\n"); 

    for (i = 0; i < count; i++) { 
     printf("%d %s\n", i + 1, p[i]); //printing names with serial numbers. 
    } 

    printf("********************************\n"); 
} 

Ich habe noch keine anderen Funktionen implementiert (wie Löschen, Suchen usw.), wie Sie int switch-case sehen können.

+0

zwei der 'if'-Anweisungen haben eine nachstehende'; ', die nicht da sein sollte. Der Code sollte beim Aufruf von 'scanf()' auf Fehler prüfen und beim Aufruf von 'fgets()' – user3629249

+0

beim Kompilieren immer alle Warnmeldungen aktivieren. dann repariere diese Warnungen. – user3629249

Antwort

8

Es gibt eine falsche ; am Ende des

if (strstr(p[i], str) != NULL); 

Daraus ergibt sich die if Anweisung tut nichts und die nächste Anweisung break; wird immer ausgeführt.

Es gibt 2 Vorkommen dieses Fehlers in der find-Funktion.

+0

so ein dummer Fehler. Wie auch immer, danke, dass du es aufgezeigt hast. –

1

strcasestr() ist Nicht-Standard und nur definiert, wenn Sie diese an der Spitze der Quelldatei zu tun, die verwendet es:

#define _GNU_SOURCE 

Was, warum strstr() nicht tun, was Sie erwarten, müssen Sie um Ihr Programm noch mehr zu kochen, um zu sehen, was falsch ist. Wie es aussieht, gibt es eine Menge Code, einschließlich einiger (wie die Erhöhung von count), die Sie überhaupt nicht gezeigt haben.

+0

Thnx zum Antworten. Bearbeitet, um andere Funktionen einzuschließen. Bitte schau es dir an. –