mit enter schleife beenden



  • hallo!

    ich bin verzweifelt auf der suche nach einer methode, wie man in C unter linux eine schleife durch drücken der enter-taste beenden kann...

    wäre sehr dankbar über lösungen, ansätze oder links die mir weiter helfen könnten. 🙂

    vielen dank schon mal im voraus
    mr.magoo



  • so?

    while(1) {
        int c = getchar();
        if(c == '\n')
            break;
    }
    


  • so wird die schleife doch erst immer durch eine eingabe fortgesetzt?o0
    hmmm...

    vll beser gesagt eine "endlosschleife" die durch enter beendet werden kann...



  • Willst Du dass die Schleife quasi parallel ablaeuft und du gleichzeitig noch den Prompt hast, um die Schleife also laufenderweise jederzeit unterbrechen zu koennen oder wie?
    Dann wirst Du die Schleife wohl in einen Thread packen muessen und die Abfrage nach der Unterbrechung in einen anderen Thread.



  • Hi!
    Gibt es unter Linux die Funktion _kbhit? Unter Windows klappt das, was du vorhast, mit dieser Funktion.





  • Falls du noch ein Beispiel mit Posix-Threads suchst, hab ich hier mal schnell was zusammen gebastelt:

    /* compile with gcc example.c -lpthread */
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>  /* sleep */
    #include <pthread.h> /* threading */
    
    void* output(void* nada)
    {
    	while(1) {
    		printf("hallo welt\n");
    		sleep(1);
    	}
    	return 0;
    }
    
    void start_output(void)
    {
    	pthread_t output_thread;
    	if(pthread_create(&output_thread, NULL, output, NULL) != 0) {
    		fprintf(stderr, "cannot create output thread\n");
    		exit(-1);
    	}
    }
    
    int main(void)
    {
    	start_output();
    	while(1) {
    		int c = getchar();
    		if(c == '\n')
    			break;
    	}
    	return 0;
    }
    


  • Nja, das wuergt ihm ja gleich das Program ab - Klappe zu, Affe tot.

    Imo kannste wenn Du mit Threads arbeiten willst, zB mit ner globalen Variable arbeiten um den while-Thread aus der Schleife zu befreien, wenn der andere ein "\n" bekommt.

    /*
      global
    //*/
    static unsigned char End_loop = 0; // ;-)
    //...
    
    /*
      "while" thread function
    //*/
      do{
        // ...
        if(End_loop) break;
      }while(1);
    // ...
    
    /*
      "getchar" thread function
    //*/
    // ...
        End_loop = 1;
    // ...
    

    Ne weitere Moeglichkeit in der Situation waere imho auch mit popen() oder ner named Pipe was an den anderen Thread zu senden, also allgemein mit Piping zu arbeiten, statt der globalen Variablen.
    Wenns was einfacheres werden soll, ginge das auch schlicht mit fork() und zwei Childprozessen, statt mit Threads. Dann geht ausserdem auch pipe() (afaik geht pipe() nur mit fork).
    Du kannst den anderen Thread / Childprozess so aus der while Schleife raushauen und zumindest auch weiterbenutzen.



  • Fabeltier schrieb:

    Nja, das wuergt ihm ja gleich das Program ab - Klappe zu, Affe tot.

    Das ist ja auch nur ein Minimalbeispiel.

    Aber um den Wortlaut ein wenig zu korrigieren:
    Eine Schleife kannst du mit <Enter> nicht beenden. Du kannst ein Newline Zeichen von stdin einlesen, aber eine Schleife kannst du syntaktisch nur beenden, indem du sie mit break beendest, mit return rausspringst und die Funktion verlässt oder mit goto zu einer Marke unterhalb der Schleife springst (o. longjmp). Aber Sprachsyntax und I/O hängen (zumindest in C) nicht zusammen.



  • Hi, kenne mich noch nicht so gut aus, aber mit curses.h geht das glaube ich und zwar mit

    while(getch() != '\n')
    {
        //Deine Schleife
    
        nodelay(); /*getch wartet dann nicht auf die eingabe*/
        getch();
    }
    

    mit nodelay wartet getch dann nicht auf die eingabe sondern führt die schleife fort bis enter gedrückt wird...

    hoffe das war richtig 🙂

    Edit: sorry hatte ich vergessen, es könnte sein das du danach mit delay() wieder das warten aktivieren musst..

    hoffe ich habe kein Müll erzählt.. 🙄

    vlg strige



  • DOCH hast Müll erzählt!



  • echt? bei mir hats funktioniert? warum hats net funktioniert?


Log in to reply