Word aus Zeile auslesen



  • hüstel, könntest du mir das etwas ausführen? ich verstehe leider nicht was du meinst..



  • Du meinst mit word 2 Bytes Daten, richtig (also 2 char's)? Lies 2 char's ein und setze sie folgendermaßen zusammen:

    char c1='F';
    char c2='9';
    short sh=(c1<<8) & c2;  //dein word enthält nun c1 (high) und c2 (low)
    

    (ungetestet)

    Oder habe ich dich falsch verstanden?



  • kulturfenster schrieb:

    while(fgets(line, MAX_LINE, file) != NULL){ 
       printf("%s", line[0]);
    }
    

    Was für ein Typ musst du bei "%s" übergeben? Sicher keinen char wie du es hier tust.



  • _matze schrieb:

    Oder habe ich dich falsch verstanden?

    Ich nehme an er meint das erste Wort.



  • Oder habe ich dich falsch verstanden?

    nein, sorry, ich meine das erste worT.



  • Und? Hast du den Fehler gefunden? Wenn nicht, dann nochmal die Dokumentation von printf() lesen.



  • Unabhängig vom Fehler (der dir hoffentlich klar ist): wenn du das erste Wort (also bis zum Leerzeichen) deiner Zeile ausgeben willst, ist das hier eine von vielen Möglichkeiten:

    char line[]="hello word!";
    char *p=line;
    while(*p!=' ' && p-line<strlen(line)) {
    	putc(*p++,stdout);
    }
    


  • ok, nun bin ich der Lösung schon sehr Nahe.

    Ich möchte das erste Wort nun nicht auf dem Bildschrim ausgeben, sondern in einem Array bzw. String speichern.

    hier mein Versuch:

    char *word;
    word = (char *) malloc(MAX_SIZE * sizeof(char));
    ...
    input = line;
    while(input != ' ' && line-input < strlen(line))
    {
      word[word_counter++] = input;
    }
    

    was läuft da schief?



  • Zeile 2: Rückgabewerg von malloc nicht casten. Das ist C++, kein C.
    Zeile 2: * sizeof(char) ist überflüssig, da ein char immer genau 1 byte groß ist.
    Zeile 5: input ist vermutlich ein Char-Pointer, daher macht der Vergleich mit einem Zeichen keinen Sinn. Vergessen input zu dereferenzieren?
    Zeile 5: Du meinst vermutlich input - line, denn input wird auf folgende Zeichen zeigen, also eine höhere Addresse haben.
    Zeile 6-8: Du hast vergessen input zu inkrementieren.



  • ok, ich hab meinen Code nun angepasst:

    input = *line;
    	 while(input != ' ' && input-line < strlen(line))
    	 {
    	 	word[word_counter++]=input++;
    	 }
    

    doch nun bekomm ich beim Kompilieren folgende Fehlermeldung:

    error: invalid operands to binary - (have ‘int’ and ‘char *’)

    (bezieht sich auf Zeile 2)
    google konnte mir leider nicht weiterhelfen 😞



  • kulturfenster schrieb:

    doch nun bekomm ich beim Kompilieren folgende Fehlermeldung:

    error: invalid operands to binary - (have ‘int’ and ‘char *’)

    Wie ist input definiert? Zeig am besten mal das ganze Ding, so wie es gerade ist.
    🙂



  • int main(void)
    {
    	int key_counter;
    	int word_counter = 0;
    	char input;
    	char *line;
    	char *word;
    	FILE *file;
    	char keys[MAX_NR_KEYS][MAX_KEY_LENGTH];
    
    line = malloc(MAX_LINE);
    	word = malloc(MAX_LINE);
    
    	file = fopen("foo.txt", "r");
    	while(fgets(line, MAX_LINE, file) != NULL){ 
    
    	 input = *line;
    	 while(input != ' ' && input-line < strlen(line))
    	 {
    	 	word[word_counter++]=input++;
    	 }
    
    	printf("Word: %s\n", word);
    

    }
    🕶



  • input darf kein char sein! Das muss ein Pointer - also char* - sein, deswegen geht input-line nicht (du darfst von einem char keinen Zeiger abziehen). input++ bewirkt bei dir auch nicht, dass du ein Zeichen weiterrutschst. Du inkrementierst einfach deinen char (dein Zeichen) und machst z.B. aus 'A' ein 'B'. Sieh dir mein Beispiel am besten noch mal ganz genau an. Dort ist p der Zeiger, der im Puffer immer eins weiter geht. Genau sowas sollte dein input sein, dann klappt es wahrscheinlich besser.



  • _matze schrieb:

    char line[]="hello word!";
    char *p=line;
    while(*p!=' ' && p-line<strlen(line)) {
    	putc(*p++,stdout);
    }
    

    Es ist eine schlechte Sache, in vor jedem Durchlauf strlen() aufzurufen, erst recht wenn es auch reichen würde, nachzusehen, ob *p nicht Null ist.
    🙂


Anmelden zum Antworten