Hallo Zusammen, ich habe ein Problem und hoffe ich bekomme von euch eine Lösung. Und zwar ich möchte gerne während der Funktion rand() am laufen ist, Zeichen eingeben. das Drücken der Enter-Taste sollte mein Programm abbrechen und die bis hin eigegebenen Zeichen miteinander hängen und als ein String ausgeben. bis jetzt schaffe ich es mit diesem Program die Eingabe der Zeichen aber ich weiß nicht wie ich weiter machen sollte, um die Zeichen als einzeln String auszugeben. ich würde mich au euren Ideen freuen. Mfg int main() { int c; int a; while (1) { a = rand()% 100; printf("%i\n", a); _sleep(100); if (kbhit()) { c =_getch(); if (c == '\r') { break; } printf("%c\n", c); } } printf("You Pressed enter, End Of Program"); return 0; }
Wenn du einen String einlesen willst - warum dann einzelne Char einlesen und nen dann nen String zusammenschustern? Was spricht gegen fgets aus dem stdio Header?
char txt[1000]; char *p=txt; while(p<txt + sizeof txt) statt while(1) *p++=c; statt direkter Ausgabe *p=0; am Ende Und wundern, warum es Abstürzt, wenn man nicht früh genug beendet.
vielleicht so?
1 | #define MAXBUFFER 200 // nach Belieben
|
2 | int main() |
3 | {
|
4 | char c; |
5 | int a; |
6 | int chr_cnt=0; |
7 | char in_command[MAXBUFFER]; |
8 | char in_buff[MAXBUFFER]; |
9 | while(1) |
10 | {
|
11 | a = rand()% 100; |
12 | printf("%i\n", a); |
13 | _sleep(100); |
14 | |
15 | if(kbhit()) |
16 | { c =_getch(); |
17 | if(c == '\r') // Wenn das Enter ankommt |
18 | { in_buff[chr_cnt]=0; |
19 | strcpy(in_command, in_buff); |
20 | // strcpy(in_buff,"");
|
21 | memset(&in_buff[0], 0, sizeof(in_buff)); |
22 | chr_cnt = 0; |
23 | }
|
24 | else // Falls kein Enter muss der Text gespeichert werden |
25 | {
|
26 | if(isprint(c)) |
27 | { if(chr_cnt<(MAXBUFFER-2)) |
28 | in_buff[chr_cnt++] = c; |
29 | else
|
30 | { //Serial.println(F("serBUF ov-> DEL")); |
31 | *in_buff=0; |
32 | *in_command=0; |
33 | chr_cnt=0; |
34 | } // if(!(chr_cnt<(MAXBUFFER-2))) |
35 | } // if(isprint(c)) |
36 | } // if(!(c == '\r')) |
37 | } // if(kbhit()) |
38 | } // while(1) |
39 | printf("You Pressed enter, End Of Program"); |
40 | return 0; |
41 | }
|
:
Bearbeitet durch User
> Was spricht gegen fgets aus dem stdio Header?
das Problem mit fgets ist, dass das Programm gestoppt wird bis ein
String eingelesen wird und das will ich aber nicht. ich will
gleichzeitig mit der rand() Zeichen eingeben und nach dem Drücken der
Enter-Taste die eingegebenen Zeichen zusammen hängen und als String
ausgeben.
Es scheint so, als wenn Du annimmst, dass die Funktion rand() eine lange Zeit (im Vergleich zu der Zeit, die der Benutzer für eine Eingabe braucht) benötigt, bis sie fertig ist. Wie kommst Du zu dieser Annahme? In diesem Forum ist es im übrigen so, dass konkrete Fragen erwartet werden. Du hingegen teilst nur mit, dass Du bei einem bestimmten Problem nicht weiterkommst. Was ist das Hindernis genau? Im Kontext Deines ganzen Beitrages und im Sinne einer Hilfe zur Selbsthilfe kann man nur erwidern: 1. Lerne, was der Unterschied zwischen Zeichen und Strings (Zeichenketten) ist und welche Operationen es auf die beiden gibt. 2. Bechreibe die Abfolge der Operationen so, dass Zeichen zu einem String zusammengefügt werden.
> geile Fehlermeldung, suche den Fehler!
sorry war mein Fehler... Funktioniert
:
Bearbeitet durch User
Kaiser K. schrieb: >> geile Fehlermeldung, suche den Fehler! > > sorry war mein Fehler... Funktioniert na prima und lernst du was aus dem Code?
> na prima und lernst du was aus dem Code?
sicher lerne ich was von dem Code. Vielen Dank nochmal für Hilfe
Kaiser K. schrieb: >> Was spricht gegen fgets aus dem stdio Header? > > das Problem mit fgets ist, dass das Programm gestoppt wird bis ein > String eingelesen wird und das will ich aber nicht. Hmm, schade. Das hätte nämlich den Vorteil gehabt, dass dein Programm nicht ständig einen CPU-Core zu 100% auslastet, indem es pro Sekunde ein paar Millionen mal nachfragt, ob inzwischen eine Taste gedrückt wurde.
> CPU-Core zu 100% auslastet, indem es pro Sekunde ein > paar Millionen mal nachfragt In diese Wiederholschleife könnte man ja einen delay mit ein paar ms einbauen.
Stefanus F. schrieb: >> CPU-Core zu 100% auslastet, indem es pro Sekunde ein >> paar Millionen mal nachfragt > > In diese Wiederholschleife könnte man ja einen delay mit ein paar ms > einbauen. Das ist aber auch keine saubere Lösung.
Rolf M. schrieb: >>In diese Wiederholschleife könnte man ja einen delay mit ein paar ms >>einbauen. > > Das ist aber auch keine saubere Lösung. Polling ist das 1. Problem - und die Schleifen ohne Pausen sind dann das daraus resultierende 2. Problem Und wenn nun ein Core mit 100% ausgelastet ist - kannst Du ja ein fork starten, der im Polling nur auf Enter wartet ... so bekommst du nach und nach die Last auf der CPU verteilt ;-)
Joachim B. schrieb: > vielleicht so? > > >
1 | > while(1) |
2 | > { |
3 | >
|
4 | > } |
5 | > else // Falls kein Enter muss der Text gespeichert werden |
6 | > { |
7 | >
|
8 | > printf("You Pressed enter, End Of Program"); |
9 | > return 0; |
10 | > } |
11 | >
|
hast du Vllt eine Idee wie man von dieser While- Funktion rauskommt und eine andere starte ohne die Funktion break? also: ZB wenn ich start eintippe sollte dAs programm von dieseer while funktion zu einer zweiten springen.
falsch zitiert while darf nie verlassen werden, baue doch weiter Funktionen innerhalb while(1) ein hinter kbhit! dort steht in strcpy(in_command, in_buff); in_command dein Eingabebefehl mit if(!strcmp(in_command, "start")) { // Programmteil "start" ausführen start(); // danach ist der Befehl ja ausgefuehrt und kann geloescht werden *in_command=0; }
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.