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
charcommand[128];
3
for(;;){
4
fgets(command,128,stdin);
5
printf("'%s'",command);
6
}
7
return0;
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...
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. ;)
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.
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...
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?
@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.
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...
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.