fscanf und char*
-
Hi Leute,
folgender Quelltext:
void Einlesen(char* Dateiname) { FILE *Datei; char *Wort; int Zahl; char zeichen; Datei = fopen ( Dateiname , "r" ); if (Datei == NULL ) { } else { while (( zeichen = getc(Datei)) != EOF ) { fscanf(Datei, "%s", &Wort); } fclose (Datei); } }
So wie ich feststellen musste vertragen sich char* und scanf/fscanf nicht und ich müsste stattdessen ein char[]-Array verwenden also zum Beispiel :
char Test[50] ... fscanf(Datei, "%s", &Test);
So jetzt habe ich nur ein winziges Problem
Ich will nämlich wenn wunderts ne Abfrage über den Inhalt der
eingescannten Zeichenkette machen also so etwas wieif (Wort == "blablabla") { ... }
aber mit char* bin ich ja schon bei scanf gescheitert
dann hab ich es nochmal so probiert:
char Test[50] ... fscanf(Datei, "%s", &Test); if (Wort == "blablabla") { ... }
da kommt aber dann ne Fehlermeldung, dass man die Länge des char x
nicht auf die Länge des chars y konvertieren kanndann hab ich folgenden Sub programmiert, weil bei eingelesenen Chars
soviel Müll hinter dem eigentlichem eingelesenen Wort steht, dass man
keine Vernünftige abfrage starten kann.
(wenn ich charWort[50]
habe und das Wort Müll einlese ist
Wort[4]
zum Beispiel irgend so ein komisches Sonderzeichen
bool CharVergleich(char Wort1[], char Wort2[]) { int a; bool b; for (a = 0; a < 50; a++) { if (Wort1[a] != Wort2[a] && Wort1[a] != ' ') { b = false; break; } else { b = true; break; } } return b; }
Aber der klappt natürlich auch net
Würd mich sehr über Hilfe freuen
MfG VB-Veteran
-
- scanf erwartet als 2. Parameter einen Pointer. Deine Variable Wort ist aber bereits ein Pointer. Durch Anwendung des Adressoperators übergibst du die Adresse des Pointers und nicht des Speichers, auf den er zeigt.
- Arrays verhalten sich syntaktisch von den Grundzügen her wie Pointer, von daher ist auch hier der Adressoperator(&) nicht erforderlich.
- Pointer zeigen immer auf einen Speicherbereich, den du selbst mit new reservieren musst. Bei deiner Variable Wort hast du das nicht getan.
*char Wort = new char[50];
- C-Strings kannst du nicht mit dem Operator == vergleichen sondern musst die Funktion strcmp verwenden. Das liegt daran, dass dein Pointer durch seine Adresse charakterisiert wird und das Stringliteral "blabla" vom Typ const char* ist. Somit vergleichst du mit == nur die Adressen beider Pointer, die aber natürlich nicht identisch sein werden.
- Subs werden in C++ Funktionen genannt
Wobei das bei Basic ja auch für Funktionen mit Rückgabewert zutrifft.
- C-Strings werden mit dem Zeichen mit dem ASCII-Wert 0 beendet, nicht mit Leerzeichen (ASCII 32), du solltest deine CharVergleich-Funktion dementsprechend anpassen. Wenn dein String kürzer als die reservierten 50 Zeichen ist, sind alle Zeichen hinter der Nullterminierung als ungültig zu betrachten weil es zufällige oder alte Werte im Speicher sind. Deshalb solltest du in der for-Schleife nicht bis 50 zählen sondern so lange weiter bis das Nullzeichen erreicht ist.
-In einem char[4]-Array hat das Wort "Müll" übrigens keinen Platz, da du immer ein Zeichen mehr an Speicher für die Nullterminierung einplanen musst.
-
Dankeschön hat geklappt
MfG VB-Veteran