Problem: String vergleich immer true



  • 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