Forum: PC-Programmierung string mit getchar auslesen


von Kaiser K. (kingkong_18)


Lesenswert?

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;
}

von Walter K. (walter_k488)


Lesenswert?

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?

von A. S. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
von Kaiser K. (kingkong_18)


Lesenswert?

funktionniert leider nicht

von Kaiser K. (kingkong_18)


Lesenswert?

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

von Theor (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

Kaiser K. schrieb:
> funktionniert leider nicht

geile Fehlermeldung, suche den Fehler!

von Kaiser K. (kingkong_18)


Lesenswert?

> geile Fehlermeldung, suche den Fehler!

sorry war mein Fehler... Funktioniert

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Kaiser K. schrieb:
>> geile Fehlermeldung, suche den Fehler!
>
> sorry war mein Fehler... Funktioniert

na prima und lernst du was aus dem Code?

von Kaiser K. (kingkong_18)


Lesenswert?

> na prima und lernst du was aus dem Code?

sicher lerne ich was von dem Code.  Vielen Dank nochmal für Hilfe

von Stefan F. (Gast)


Lesenswert?

Der Kaiser K. verarscht und doch!

von Rolf M. (rmagnus)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Walter K. (walter_k488)


Lesenswert?

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

von Kaiser K. (kingkong_18)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.