Ein Zeichen einlesen!
-
Hi!
Ich hab ein "derbes" Problem!
char Zeichen = " ";
nun will ich genau ein Zeichen aus der Eingabe einlesen!
.. (sscanf(argv[1],"%c",&Zeichen)...
Er ließt zwar das Zeichen ein aber es sind auch noch andere Zeichen enthalten die in einer anderen Variable stehen!
Kann es sein das Zeichen irgendwie auf den Speicher der anderen Variable zugreift??
Wie deklariere ich den einen Char der genau nur ein Zeichen annimmt, damit da nix schief läuft???
STEH VOLL AUF'EM SCHLAUCH!!
-
So,
char Zeichen = ' ';
nicht so:
char Zeichen = " ";
sscanf() stimmt
-
Ja danke!
Aber es steht trotzdem irgendetwas in dem Zeichen nach %c den ich eingelesen habe!
Kann ich den char nicht so deklarieren das er genau ein Zeichen annimmt und zwar das Zeichen was ich einlese!
-
Thes-One schrieb:
Aber es steht trotzdem irgendetwas in dem Zeichen nach %c den ich eingelesen habe!
kann nicht sein. ein 'char' fasst nur ein zeichen
Thes-One schrieb:
Kann ich den char nicht so deklarieren das er genau ein Zeichen annimmt und zwar das Zeichen was ich einlese!
char zeichen[1];, aber das ändert nix an deinem problem. zeig mal den ganzen code.
-
unsigned int LEN = 0; char ZEILE[256]=" ", TITEL; char STATUS =' '; /*Zeilen in Datei? == Groesse des Dynamischen Arrays*/ while( fgets(ZEILE, 256, file) != NULL ) {LEN++;} /*DateiZeiger wieder an den Anfang*/ fseek(file,0,SEEK_SET); ... .. . /*Eine Zeile aus der Datei laden*/ while( fgets(ZEILE, 256, file) != NULL ){ /*Zeile pruefen auf SyntaxFehler*/ if ( !(sscanf(ZEILE,"%c;%[a-z A-Z0-9.,];",&STATUS,&TITEL)==2) ){ /*SYNTAXFEHLER*/ ... .. . }else{ /*ABFRAGE OB TITEL SCHON ENTHALTEN*/ { ... .. . }else{ /*ALLES OK -> VERARBEITUNG KANN BEGINNEN*/ }
-
für den 'character set specifier' %[...] brauchst du ein paar bytes mehr. ein einzelnes zeichen TITEL reicht nimmer nicht (allein schon aus dem grund, weil eine 0 angehängt wird).
-
Ja guut!
Kannst du mir denn eventuel sagen wie groß TITEL sein muss??
Wie würde das aussehen??Das komische ist aber das der TITEL richtig eingelesen wird !
Am STATUS ist irgendetwas falsch!
Bei einer eigabe von : V;Harry Potterist TITEL = Harry Potter
und STATUS = VIIII..V;HARRY POTTER???
???
-
Thes-One schrieb:
Kannst du mir denn eventuel sagen wie groß TITEL sein muss??
so gross wie der längste titel den du erwartest + 1 (für die 0 am ende).
Thes-One schrieb:
Das komische ist aber das der TITEL richtig eingelesen wird !
Am STATUS ist irgendetwas falsch!
Bei einer eigabe von : V;Harry Potter
ist TITEL = Harry Potter
und STATUS = VIIII..V;HARRY POTTERist doch klar, TITEL ist zu kurz und daher wird der speicher dahinter von 'scanf' zerbröselt, z.b. dein STATUS.
-
Ja!
Es ist ja so das ich den TITEL zwischenspeichere und dann hole ich mir erst den Speicher!
Ich habe noch ein struct in dem der TITEL letztendlich gespeichert wird!
Das heißt ich hohle mir erst dann den Speicher mitstruct->Titel = malloc (sizeof(char) * strlen(TITEL)+1);
Das heißt ich kann nicht wissen wie groß der Titel ist!
Er soll den TITEL aus der ZEILE einfach einlesen bis zum ";"
Und er soll es nur einlesen wenn er aus Groß oder Klein Buchstaben oder Zahlen oder Punkt oder Kommata besteht!
-
Thes-One schrieb:
Es ist ja so das ich den TITEL zwischenspeichere und dann hole ich mir erst den Speicher!
das ist nicht richtig so. du musst zuerst speicher haben und kannst danach etwas einlesen.
Thes-One schrieb:
Ich habe noch ein struct in dem der TITEL letztendlich gespeichert wird!
Das heißt ich hohle mir erst dann den Speicher mit
struct->Titel = malloc (sizeof(char) * strlen(TITEL)+1);warum packst du den titel nicht gleich in struct->Titel ?
Thes-One schrieb:
Das heißt ich kann nicht wissen wie groß der Titel ist!
im zweifelsfall machste einfach TITEL bzw. struct->Titel so gross wie ZEILE.
Thes-One schrieb:
Er soll den TITEL aus der ZEILE einfach einlesen bis zum ";"
Und er soll es nur einlesen wenn er aus Groß oder Klein Buchstaben oder Zahlen oder Punkt oder Kommata besteht!ja, das mit dem %[..] wird wohl dafür gehen, musste nochmal nachlesen wie %[...] genau funzt. besser wär's vielleicht mit strtok oder sowas die ZEILE zu zerlegen.