mikrocontroller.net

Forum: Compiler & IDEs gcc string einlesen - geht zwar aber "gibt nich alles aus"


Autor: ichbins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verzweifle gerade irgendwie... Da scanf nach dem ersten Leerzeichen 
schlapp macht, suche ich eine andere Möglichkeit. gets() kommt nicht in 
Frage, da meckert der Compiler, dass das gefährlich ist und nicht 
verwendet werden soll - keine Diskussion :D

Nun will ich das mit fgets machen. Ich habe mal alles was nichts mit dem 
String zu tun hat aus dem Code geschnibbelt, hier:
void *thread_func(void* x) {
    char command[128];
    for(;;) {
      fgets(command, 128, stdin);
      printf("'%s'", command);
    }
    return 0;
}
Zu sagen wäre noch, dass diese Funktion einen von drei Threads 
darstellt, es findet zwar "Kommunikation" zwischen zwei von dreien mit 
Globalen Variablen statt, aber nicht mit den Strings bzw Arrays.

Wenn ich nun z.B. gehtnix eingebe, dann gibt er mir > 'gehtnix < aus und 
hängt bei printf obwohls > 'gehtnix' < heissen soll.

Ich hoffe mir kann jemand bei dem Problem helfen...

: Verschoben durch User
Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichbins schrieb:
> Wenn ich nun z.B. gehtnix eingebe, dann gibt er mir > 'gehtnix < aus und
> hängt bei printf obwohls > 'gehtnix' < heissen soll.

Wie gibst du den String ein? Da wird wohl noch ein \r\n oder sowas daran 
hängen, sodass dein zweites ' auf der nächsten Zeile landet. Abhängig 
von der Pufferung erscheint diese Zeile erst, wenn ein weiteres \r\n 
oder dergleichen ein Schreiben erzwingt. Mach mal n fflush() nach dem 
printf().

Was du noch tun solltest ist ne kleine Fehlerprüfung nach dem Aufruf von 
fgets() implementieren. Null Pointer dereferenzieren ist nicht gut. ;)

Autor: ichbins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das printf läuft noch nichmal durch, das zweite ' zeigt es gar nicht an, 
ein fflush() bringt also nichts, wenns noch nicht mal aufgerufen wird.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichbins schrieb:
> dann gibt er mir > 'gehtnix < aus

fgets liest eine Zeile (maximal), ggf. mit dem abschließenden
Zeilenvorschub (der von deiner Returntaste kommt).
Deshalb kann er in der Zeile den schließenden ' nicht ausgeben;
der sollte aber dann in der nächsten Zeile stehen.

Ansonsten mach doch mal ein einfaches kleines, aber komplettes
Programm draus, in demn der Fehler auch noch auftritt, und nicht
nur einen Schnippsel mit einer unverständlcihen Beschreibung,
was irgendwelche Threads angeblich machen oder nicht.

Autor: ichbins (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe gerade wenn ich sowas hier versuche:
      command[4] = '\0';
und dann ein Wort eingebe was länger ist, dann gibt er mir gar nichts 
mehr aus, nichtmal das ' vor dem String.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom M. schrieb:
> Was du noch tun solltest ist ne kleine Fehlerprüfung nach dem Aufruf von
> fgets() implementieren. Null Pointer dereferenzieren ist nicht gut. ;)

Das mit dem Prüfen ist im Prinzip richtig, aber command wird nicht
zu einem Nullpointer mutieren...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichbins schrieb:
> Ich sehe gerade wenn ich sowas hier versuche:      command[4] = '\0';
> und dann ein Wort eingebe was länger ist, dann gibt er mir gar nichts
> mehr aus, nichtmal das ' vor dem String.

Das ist jetzt aber auch kein ganzes Programm, oder?

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für Linux:
#include <stdio.h>
#include <string.h>

int main(void) {
    char command[128];
    int l;
    for(;;) {
      fgets(command, 128, stdin);
      l=strlen(command);
      command[l-1]='\0';
      printf("String: '%s' \nLaenge: %i\n", command,l);
    }
    return 0;
}

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@hp-freund:

Das hat noch einen Schönheitsfehler...
Wenn der Benutzer 127 oder mehr Zeichen eingibt, steht kein \n,
wo du es überschreibst.
Sollte aber eh nicht vorkommen, weil keiner geteilte Zeilen
wieder zusammensetzen wird - insofern ist es egal.

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Abfangen von Fehleingaben ist ein eigenes Kapitel ;)

Autor: schn\0er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hp-freund schrieb:
> fgets(command, 128, stdin);
> l=strlen(command);
> command[l-1]='\0';

fgets() fügt normalerweise eine \0 an. Wenn dem nicht so wäre, würde 
strlen() erst recht nicht wie gewünscht funktionierenm, da diese nach 
einer \0 sucht...

Autor: hp-freund (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau!
Hier wird auch nur das \n abgeschnitten....

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schn\0er schrieb:
> Autor:
>
>         schn\0er (Gast)

... und schnuller schreibt man nur mit einem n :-)

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ichbins schrieb:
> Das printf läuft noch nichmal durch, das zweite ' zeigt es gar nicht an,
> ein fflush() bringt also nichts, wenns noch nicht mal aufgerufen wird.

Woran erkennst du denn, daß das printf nicht "durchläuft"?

ichbins schrieb:
> Ich sehe gerade wenn ich sowas hier versuche:      command[4] = '\0';
> und dann ein Wort eingebe was länger ist, dann gibt er mir gar nichts
> mehr aus, nichtmal das ' vor dem String.

Kein Wunder. Dann ist ja auch gar kein \n da, und damit bleibt nicht nur 
das letzte ' im Puffer hängen, sondern eben alles.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.