Moin.
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. Nur blöderweise macht scanf immer nach dem Drücken auf Enter die Eingabe in einer neuen Zeile. Das sieht dumm aus, zumal es sich um die Komponenten eines Zeilenvektors handelt. Wie bewege ich also scanf dazu schön in der Zeile zu bleiben? Ich meine bei printf geht's ja auch, da läßt man einfach den newline-Operator weg, fertig. Nur scanf ärgert mich hier ein wenig.
MfG
Carsten
Carsten Friede cfriede@wh12.tu-dresden.de wrote:
Moin.
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. Nur blöderweise macht scanf immer nach dem Drücken auf Enter die Eingabe in einer neuen Zeile. Das sieht dumm aus, zumal es sich um die Komponenten eines Zeilenvektors handelt. Wie bewege ich also scanf dazu schön in der Zeile zu bleiben? Ich meine bei printf geht's ja auch, da läßt man einfach den newline-Operator weg, fertig. Nur scanf ärgert mich hier ein wenig.
Soll das Programm nach Enter in der aktuellen Zeile bleiben? Das stelle ich mir umständlich vor (zumindest kenne ich kein scanf, das nicht auf die nächste Zeile gehen würde). Alle Zahlen in einer Zeile als Zeichenkette einzulesen und mit Kommata zu trennen sollte einfacher sein, und auch gewohnter als innerhalb einer Zeile mehrmals Enter zu drücken.
mfg, Fabian
On Wed, Jun 18, 2003 at 07:27:34PM +0200, Fabian Hänsel wrote:
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. Nur blöderweise macht scanf immer nach dem Drücken auf Enter die Eingabe in einer neuen Zeile. Das sieht dumm aus, zumal es sich um die Komponenten eines Zeilenvektors handelt. Wie bewege ich also scanf dazu schön in der Zeile zu bleiben? Ich meine bei printf geht's ja
Garnicht. Jedenfalls nicht so einfach. Du könntest versuchen, mit Terminal-Steuercodes wieder die vorhergehende Zeile zu erreichen. Du könntest versuchen, die Konsole im raw-Mode zu betreiben, so daß Du Dich um die Verarbeitung der einzelnen eingegebenen Zeichen (incl. Enter) kümmern mußt, Du könntest nach solchen Dingen wie curses schauen oder nach der ReadLine-Library.
Oder einfach den Nutzer alles auf einer Zeile, mit Leerzeichen getrennt, eingeben lassen.
Bis auf die letzte Aussage habe ich keine der anderen Sachen wirklich probiert.
auch, da läßt man einfach den newline-Operator weg, fertig. Nur scanf ärgert mich hier ein wenig.
Weil scanf() ja erst die Zeile kriegt, wenn sie vom Konsolentreiber an Dein Programm übergeben wird, und im cooked-Mode ist das normalerweise dann, wenn Enter gedrückt wurde, und für das Echo der Zeichen (und das Echo auf Enter sieht eben so: aus - wird auch vom Konsolentreiber gemacht.)
Heiko
Als Anregung (habe noch nie was mit {n,}curses gemacht - nur eben mal etwas Manpage gelesen und dann probiert)
#include <curses.h>
int main(int argc, char** argv) { int i; initscr(); cbreak();
mvprintw(0, 0, "Die Eingabe bitte..."); for (i = 0; i < 10; ++i) { char s[20]; mvprintw(3, 3, "Element %2d: ", i); clrtoeol(); getnstr(s, sizeof(s) - 1); /* und nun umwandeln in was auch immer... */ }
endwin(); }
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann
Fabian Hänsel schrieb:
Carsten Friede cfriede@wh12.tu-dresden.de wrote:
Moin.
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. Nur blöderweise macht scanf immer nach dem Drücken auf Enter die Eingabe in einer neuen Zeile. Das sieht dumm aus, zumal es sich um die Komponenten eines Zeilenvektors handelt. Wie bewege ich also scanf dazu schön in der Zeile zu bleiben? Ich meine bei printf geht's ja auch, da läßt man einfach den newline-Operator weg, fertig. Nur scanf ärgert mich hier ein wenig.
Soll das Programm nach Enter in der aktuellen Zeile bleiben? Das stelle ich mir umständlich vor (zumindest kenne ich kein scanf, das nicht auf die nächste Zeile gehen würde). Alle Zahlen in einer Zeile als
Genau das ist ja mein Problem.
Zeichenkette einzulesen und mit Kommata zu trennen sollte einfacher sein, und auch gewohnter als innerhalb einer Zeile mehrmals Enter zu drücken.
Hm, wie kriege ich dann aber die einzelnen Positionen, wenn da im String Kommata stehen? Die Zeichenkette stellt wie gesagt einen Zeilenvektor einer Matrix dar. Deswegen hab' ich die Eingabe auch in eine Schleife gepackt, so daß die Eingabewerte immer schön in die einzelnen Positionen der Matrix eingetragen werden. Wenn ich die Eingabe als Feldvariable realisiere, habe ich doch das Problem, daß jedes Zeichen eine Position darstellt. In einer Matrix kann es aber auch mehrstellige Komponenten geben.
MfG
Carsten
Carsten Friede cfriede@wh12.tu-dresden.de wrote:
Fabian Hänsel schrieb:
Carsten Friede cfriede@wh12.tu-dresden.de wrote:
Moin.
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. [...]
Soll das Programm nach Enter in der aktuellen Zeile bleiben? Das stelle ich mir umständlich vor (zumindest kenne ich kein scanf, das nicht auf die nächste Zeile gehen würde). Alle Zahlen in einer Zeile als
Genau das ist ja mein Problem.
Zeichenkette einzulesen und mit Kommata zu trennen sollte einfacher sein, und auch gewohnter als innerhalb einer Zeile mehrmals Enter zu drücken.
Hm, wie kriege ich dann aber die einzelnen Positionen, wenn da im String Kommata stehen? Die Zeichenkette stellt wie gesagt einen
Mittels strok kannst du die Kette auch gleich splitten:
=== char *p; char eingabe=["1, 2, 3"];
p=strok(str, ","); printf(p) do p=strok(NULL, ","); if(p) printf("|%s",p); while (p); ===
Gibt aus: 1|2|3
Du musst nur das printf gegen irgendwas austauschen, das zu deinen Vektoren passt.
mfg, Fabian
Heiko Schlittermann heiko@schlittermann.de wrote:
On Wed, Jun 18, 2003 at 08:38:20PM +0200, Fabian Hänsel wrote:
Mittels strok kannst du die Kette auch gleich splitten:
Du meinst strtok(). ^
Stimmt. Ich sollte um die Zeit nach einer schrecklichen Woche nicht mehr versuchen, mich an sowas zu erinnern :-)
Fabian
Du muesstest dann den String nach Kommas (oder anderen Trennzeichen) durchsuchen und aus denen eine Zeile der Matrix zusammen- basteln.
Stefan
.
On Fri, Jun 20, 2003 at 10:26:39PM +0200, Carsten Friede wrote:
Zeichenkette einzulesen und mit Kommata zu trennen sollte einfacher sein, und auch gewohnter als innerhalb einer Zeile mehrmals Enter zu drücken.
Hm, wie kriege ich dann aber die einzelnen Positionen, wenn da im String Kommata stehen? Die Zeichenkette stellt wie gesagt einen Zeilenvektor einer Matrix dar. Deswegen hab' ich die Eingabe auch in eine Schleife
double a[200]; scanf("%lf %lf %lf", &a[0], &a[1], &a[2]); oder scanf("%lf %lf %lf", a+0, a+1, a+2);
... es ist aber keine Fehlerbehandlung möglich so.
Heiko
Hallo,
dieselben Techniken, die das Parsen der Kommandozeilenparameter ermöglichen, sollten "im Grundsatz" auch hier einsetzbar sein. (Eingabe eines String, Auswertung) (man 3 getopt)
// parse parameters char c; int cfg=0; while ((c=getopt (argc, argv, "hvb:o:rtickf")) != EOF) { switch (c) { case 'h' : print_help (); return EXIT_SUCCESS; break ; case 'v' : cfg |= 1; break; case 'r' : cfg |= 2; break; case 't' : cfg |= 4; break; case 'i' : cfg |= 8; break; case 'c' : cfg |= 16; break; case 'k' : cfg |= 32; break; case 'f' : cfg |= 64; break; case 'b' : b=atof(optarg); break ; case 'o' : o=atof(optarg); break ; } } Bernhard
On Friday 20 June 2003 21:13, Carsten Friede wrote:
Moin.
Ich bastel hier gerade an einem kleinem C-Programm herum. Ich möchte mehrere Integer eingeben. Das geschieht per scanf. Nur blöderweise macht scanf immer nach dem Drücken auf Enter die Eingabe in einer neuen Zeile. Das sieht dumm aus, zumal es sich um die Komponenten eines Zeilenvektors handelt. Wie bewege ich also scanf dazu schön in der Zeile zu bleiben? Ich meine bei printf geht's ja auch, da läßt man einfach den newline-Operator weg, fertig. Nur scanf ärgert mich hier ein wenig.
MfG
Carsten
On Sunday 29 June 2003 11:07, Bernhard Schiffner wrote:
char c; int cfg=0; while ((c=getopt (argc, argv, "hvb:o:rtickf")) != EOF) { switch (c) { case 'h' : print_help (); return EXIT_SUCCESS; break ;
Sowas hatte ich auch immer in meinen Sourcen stehen, bis dann plötzlich auf PowerPC die Optionen nicht mehr stimmten: Grund: Früher hat getopt() char zurückgeliefert, heute aber int, um eben -1 abfangen zu können. Die switch-Anweisung geht dann aber genauso zu verwenden.
Josef
lug-dd@mailman.schlittermann.de