Problem: String vergleich immer true



  • Ja, sorry war ein Tippfehler, aber das Problem bleibt.



  • gulbim schrieb:

    aber das Problem bleibt.

    So kann das aber auch nichts werden, weil in Zeile 27 das zweite Argument von strcmp() ein Zeichen ist, aber ein Zeiger auf ein Zeichen sein sollte. Und solange das Ding nicht durch den Compiler will, kann es auch kein Problem mit einem "true" geben.

    gulbim schrieb:

    sorry war ein Tippfehler

    Bitte, um Himmels willen, nichts abtippen, und erst recht keinen Code. Bitte zeig den Code, der erfolgreich übersetzt werden konnte, sonst können wir dir nur schwerlich helfen.
    🙂



  • gulbim schrieb:

    [cpp]
            fgets(line[l],LAENGE,datei);  //zeilen weise lesen mit fgets...
    [/cpp]
    

    Rückgabe von fgets nicht beachtet, ganz schlecht.
    line[...] enthält hier auch meist abschließendes '\n'!

    gulbim schrieb:

    [cpp]
            scanf("%s", &str);
    [/cpp]
    

    "&" kann weg, irritiert nur.

    gulbim schrieb:

    [cpp]
            if(strcmp(line[i],str[0]) ==  0){ // Hier liegt das Problem denke ich
    [/cpp]
    

    Richtig erkannt. Wie schon erwähnt, muss "[0]" hier entfallen. Aber auch dann dürfte es nicht funktionieren, da hier line ein '\n' enthält und str nicht.



  • wennst nur ein zeichen vergleichen willst nimm doch einfach
    if(line[i][0]==str[0])
    ...



  • Ok,
    hier nochmal der überarbeitete Code:

    [cpp]#include <stdio.h>
    #include <string.h>
    #define LAENGE 100 //länger der einzelnen Zeilen
    #define ANZAHL 1000 //Anzahl der Zeilen
    
    int main()
    {
      FILE *datei;
      char line[ANZAHL][LAENGE];
      int l ;
      datei = fopen ("list.sn", "r");
      if (datei != NULL)
        {
        for(l = 0; l < ANZAHL;l++) {
            fgets(line[l],LAENGE,datei);  //zeilen weise lesen mit fgets...
        }
        fclose (datei);
        }
    
    	char str[LAENGE];	
    	int i = 0;
    	printf("Beenden => exit");
    	printf("\nSeriennummer eingeben:\n");
    	printf("=> ");
    	scanf("%s",str);
    	while(i< ANZAHL){
    	if(strcmp(line[i],str) ==  0){ // Hier liegt das Problem
    			printf("\nTreffer!!!");
    			printf("\n=> %s\n\n",str);
    			return 0;
    	}
    	i++;
    	}
    printf("Leider kein Treffer!!!\n");
    return 0;
    }[/cpp]
    

    Allerdings hab ich immer noch das Problem hab aber gemerkt, dass wenn ich in die Datei eine Zeile mit einem String von 100 Zeichen schreibe und dann nach diesem 100 Zeichen String suche funzt es. Also nur wenn str "voll" ist.



  • Fgets liest das '\n' mit ein, wenn das Array groß genug ist. Das musst du also loswerden.

    Gruß,
    B.B.



  • Wie mache ich das? Und bezieht sich das nur auf fgets oder auch scanf?



  • gulbim schrieb:

    Wie mache ich das?

    fgets(zeile, len, dat);
    if(zeile[strlen(zeile) - 1] == '\n')
       zeile[strlen(zeile) - 1] = '\0';
    


  • Nein, das geht so nicht. Für leere String crasht es.
    Besser

    if( strchr(zeile,'\n') ) *strchr(zeile,'\n')=0;
    


  • Geht nicht da bekomme ich immer die Meldung

    test.c: In function ‘int main()’:
    test.c:27: error: cannot convert ‘char (*)[100]’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’
    test.c:28: error: cannot convert ‘char (*)[100]’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’
    


  • <zeile> war natürlich nur beispielhaft gemeint, trage dort deinen Zeilenstring ein, also line[l] oder wie auch immer das bei dir heisst.



  • Hatte ich ja, aber das Problem ist gelöst dafür gibt es ein anders.

    [cpp]#include <stdio.h>
    #include <string.h>
    #define LAENGE 100 //länger der einzelnen Zeilen
    #define ANZAHL 1000 //Anzahl der Zeilen
    
    int main()
    {
      FILE *datei;
      char line[ANZAHL][LAENGE];
      int l ;
      datei = fopen ("list.sn", "r");
      if (datei != NULL)
        {
        for(l = 0; l < ANZAHL;l++) {
          //  fgets(line[l],LAENGE,datei);  //zeilen weise lesen mit fgets...
    	fgets(line[l], LAENGE, datei);
        }
        fclose (datei);
        }
    
    	char str[LAENGE];	
    	int i = 0;
    	printf("Beenden => exit");
    	printf("\nSeriennummer eingeben:\n");
    	printf("=> ");
    	scanf("%s",str);
    	while(i< ANZAHL){
    	if( strchr(line[i],'\n') ) *strchr(line[i],'\n')=0;	
      	   line[strlen(line[i]) - 1] = '\0';
    	if(strcmp(line[i],str) ==  0){ // Hier liegt das Problem
    			printf("\nTreffer!!!");
    			printf("\n=> %s\n\n",str);
    			return 0;
    	}
    	i++;
    	}
    printf("Leider kein Treffer!!!\n");
    return 0;
    }[/cpp]
    

    Dieser Code meldet:
    test.c: In function ‘int main()’:
    test.c:33: error: incompatible types in assignment of ‘char’ to ‘char [100]’

    Oder bin ich so blind und übersehe was?



  • Rück mal deinen Code richtig und einheitlich ein. So ist das ja unlesbar. Zeile 33 in deinem Code ist return 0; . Was ist Zeile 33 in test.c.



  • Ok, sorry war wirklich blöd von mir. Hier nochmal alles und zwar richtig und eingerückt:

    [cpp]#include <stdio.h>
    #include <string.h>
    #define LAENGE 100 //länger der einzelnen Zeilen
    #define ANZAHL 1000 //Anzahl der Zeilen
    
    int main()
    {
      FILE *datei;
      char line[ANZAHL][LAENGE];
      int l ;
      datei = fopen ("list.sn", "r");
    
      if (datei != NULL){
        for(l = 0; l < ANZAHL;l++){
            fgets(line[l], LAENGE, datei);
        }
        fclose (datei);
      }
    
      char str[LAENGE];	
      int i = 0;
      printf("Beenden => exit");
      printf("\nSeriennummer eingeben:\n");
      printf("=> ");
      scanf("%s",str);
      while(i< ANZAHL){
    	if( strchr(line[i],'\n') ) *strchr(line[i],'\n')=0;	
       	line[strlen(line[i]) - 1] = '\0';
    	if(strcmp(line[i],str) ==  0){
    		printf("\nTreffer!!!");
    		printf("\n=> %s\n\n",str);
    		return 0;
    	}
       i++;
      }
      printf("Leider kein Treffer!!!\n");
      return 0;
    }[/cpp]
    

    Und die Fehler:

    test.c: In function ‘int main()’:
    test.c:28: error: incompatible types in assignment of ‘char’ to ‘char [100]’
    


  • entferne die Zeile

    line[strlen(line[i]) - 1] = '\0';
    

    komplett. Eine Variante zum Entfernen von '\n' reicht, du hast beide genommen.
    Außerdem war die Zeile

    if( strchr(line[i],'\n') ) *strchr(line[i],'\n')=0;
    

    für die Stelle direkt nach fgets gedacht.



  • Ok, danke jetzt funktioniert es endlich!!!

    Aber eine Frage hätte ich noch bevor das Thema "closed" ist und zwar handelt es sich bei

    *strchr(line[l],'\n')=0;
    

    doch um einen Pointer auf die erste Stelle im String in der ein \n steht, der dann 0 zugewiesen wird? Und handelt es sich bei dem 0 im Code um ein binär Null also \0 oder um eine einfache 0?



  • Wutz schrieb:

    if( strchr(line[i],'\n') ) *strchr(line[i],'\n')=0;
    

    Aus Effizienzgründen vielleicht lieber

    char const *ptr = strchr(line[i], '\n');
    if(ptr) {
      *ptr = '\0';
    }
    

    gulbim schrieb:

    Aber eine Frage hätte ich noch bevor das Thema "closed" ist und zwar handelt es sich bei

    *strchr(line[l],'\n')=0;
    

    doch um einen Pointer auf die erste Stelle im String in der ein \n steht, der dann 0 zugewiesen wird?

    Ja (wenn das Zeichen gefunden wird. Ansonsten wird NULL zurück gegeben). Siehe man: strchr

    gulbim schrieb:

    Und handelt es sich bei dem 0 im Code um ein binär Null also \0 oder um eine einfache 0?

    binäre Null?? 0 ist Null ist '\0' 🙂



  • rüdiger schrieb:

    Aus Effizienzgründen vielleicht lieber

    char const *ptr = strchr(line[i], '\n');
    if(ptr) {
      *ptr = '\0';
    }
    

    könntest du das mal erklären irgendwie wird mir die Funktionsweise nicht ganz klar.
    Danke!



  • Hast du die von Rüdiger velinkte Dokumentation bzgöl strchr gelesen? Wenn ja, dann wäre die Frage geklärt.



  • Mein Problem liegt bei dem if:

    if(ptr) {
      *ptr = '\0';
    

    und nicht bei dem Teil den die Dokumentation erklärt. Mir ist die Allgemeine Funktionsweise nicht ersichtlich.


Anmelden zum Antworten