Forum: PC-Programmierung string mit getchar auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Kaiser K. (kingkong_18)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
funktionniert leider nicht

von Kaiser K. (kingkong_18)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Kaiser K. schrieb:
> funktionniert leider nicht

geile Fehlermeldung, suche den Fehler!

von Kaiser K. (kingkong_18)


Bewertung
0 lesenswert
nicht lesenswert
> geile Fehlermeldung, suche den Fehler!

sorry war mein Fehler... Funktioniert

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Der Kaiser K. verarscht und doch!

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.