gcc string einlesen - geht zwar aber "gibt nich alles aus"

Gast #2005846
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:
1
void *thread_func(void* x) {
2
    char command[128];
3
    for(;;) {
4
      fgets(command, 128, stdin);
5
      printf("'%s'", command);
6
    }
7
    return 0;
8
}
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...
Persönliche Seite #2005857
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. ;)
#2005862
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.
Gast #2005893
Lesenswert?

Für Linux:
1
#include <stdio.h>
2
#include <string.h>
3

4
int main(void) {
5
    char command[128];
6
    int l;
7
    for(;;) {
8
      fgets(command, 128, stdin);
9
      l=strlen(command);
10
      command[l-1]='\0';
11
      printf("String: '%s' \nLaenge: %i\n", command,l);
12
    }
13
    return 0;
14
}
#2006555
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren