Problem: String vergleich immer true
-
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 Zeileif( 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