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


von ichbins (Gast)


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...

: Verschoben durch User
von Tom M. (tomm) Benutzerseite


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. ;)

von ichbins (Gast)


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.

von Klaus W. (mfgkw)


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.

von ichbins (Gast)


Lesenswert?

Ich sehe gerade wenn ich sowas hier versuche:
1
      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.

von Klaus W. (mfgkw)


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...

von Klaus W. (mfgkw)


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?

von hp-freund (Gast)


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
}

von Klaus W. (mfgkw)


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.

von hp-freund (Gast)


Lesenswert?

Das Abfangen von Fehleingaben ist ein eigenes Kapitel ;)

von schn\0er (Gast)


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...

von hp-freund (Gast)


Lesenswert?

Genau!
Hier wird auch nur das \n abgeschnitten....

von Klaus W. (mfgkw)


Lesenswert?

schn\0er schrieb:
> Autor:
>
>         schn\0er (Gast)

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

von Rolf M. (rmagnus)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.