Problem: String vergleich immer true



  • 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.



  • Das Zeichen an der Position ptr wird mit der 0 überschrieben.
    Die 0 an der niederwertigsten Adresse (falls die Zeichenkette mehrere Nullbytes enthält) einer Zeichenkette definiert die Zeichenkettenlänge.



  • wofür dann das if? Ich glaub ich stehe auf dem Schlauch 🙂



  • Wird das '\n' nicht gefunden, liefert strchr NULL, dann ist ptr NULL.
    Das if verhindert in diesem Fall einen Programmabsturz, den eine Dereferenzierung des Null-Zeigers verursachen würde.



  • Ah ok dan würde ich sagen: closed


Anmelden zum Antworten