2016-05-03 10 views
1

Ich habe einen automatischen Schreibbot geschaffen, der Zeichen der Zeichenkette simuliert, die vom Benutzer gegeben werden.Wie man eine Zeichenkette eingibt, die " n" darin enthält

ist mein Code folgendermaßen aus:

printf("Enter speed (wpm) (1 to 11750):"); 
    scanf("%d", &speed); 
    if(speed < 1 || speed > 11750) 
    { 
     printf("\nPlease provide CORRECT DATA\n"); 
     return -1; 
    } 

    printf("Paste the String : \n"); 
    gets(exaArray); 
    exaArrayLength = strlen(exaArray); 
    relation = (int)11750/speed; 
    printf("typing will start in 2 sec-\n"); 
    Sleep(2000); 
    i=pos=0; 

    while(i<=exaArrayLength) 
    { 
     Sleep(relation); 
     if((exaArray[pos]>96) && (exaArray[pos]<123)) //small letters 
     { 
      keycode=0x41 + (exaArray[pos]%97); 
      smallLetter(keycode); //function for key simulation 
     }  
     ..... 

I-Eingang nehme mit der Funktion bekommt. Dieses Programm funktioniert einwandfrei, wenn ich Text einfüge, der keine Eingabe enthält. Dieses Programm funktioniert also gut mit einem Absatz. Wenn der Benutzer jedoch mehr als einen Absatz bereitstellt, simuliert er nur den ersten Absatz.

Weil gets bei '\ n' endet. Welche Funktion könnte mehrere Absatz-Eingaben annehmen und einer Zeichenfolge zuordnen?

+1

Schleife um die Lesefunktion, verketten, was bisher gelesen wurde. – alk

+3

OT: Aaund tu *** nicht '' gets() ', sondern stattdessen' fgets() '. – alk

+0

@alk Herr, wenn ich Eingabe wie folgt verwende - fgets (s, 20000, stdin); würde diese Anweisung nicht enden, wenn eine Eingabe oder \ n in einer Benutzereingabe vorliegt? –

Antwort

2

Nun, es gibt keine Möglichkeit für den Computer, zwischen dem Benutzer, der die Eingabetaste drückt, und der "eingefügten" Zeichenfolge, die Zeilenumbrüche enthält, zu unterscheiden. (Technisch gesehen ist das Einfügen von etwas in die Konsole wie Tippen.)

Wenn Sie nicht möchten, dass das Problem nach einem Absatz beendet wird, sondern fortfahren, können Sie es als comment alk vorschlagen (Schleife um die Lesefunktion) - Dann müssten Sie Strg + C, um das Programm zu beenden und dann würde immer noch ein Absatz geschrieben werden. Hängt davon ab, was Sie weiter mit dem Programm machen wollen.

Auf der anderen Seite, wenn Sie möchten, dass der Benutzer den gesamten Text auf einmal eingeben und nur dann verarbeiten kann, müssten Sie etwas anderes als "newline" als "Ende der Eingabe" Marker, zum Beispiel definieren etwas wie ESC.

Sie würden dies tun, indem getchar statt gets verwenden und manuell jeden char verketten, die auf diese Weise in einem String-Puffer eingegeben wird, und wenn der Charakter den Wert 27 (Escape-Taste) zum Beispiel, würden Sie die Eingangsschleife beenden und beginne mit der Ausgabe.

3

Dies ist eigentlich ein sehr hartes und komplexes Problem, das nicht einfach automatisiert zu lösen ist.

Es scheint, als wäre das Lesen in einer Schleife eine gute Lösung, aber dann kommen Sie zu dem Punkt, an dem es keine Eingabe mehr gibt und die Lesefunktion nur blockiert und auf weitere Eingaben wartet. Der einfachste Weg hieraus besteht darin, den Benutzer die Tastenkombination "Dateiende" (CTRL-D auf POSIX-Systemen wie Linux oder OSX, CTRL-Z unter Windows) eingeben zu lassen, aber der Benutzer muss dann informiert werden das zu tun.

Das Problem liegt daran, dass Ihr Programm einfach keine Ahnung hat, wie viele Daten es zu lesen ist, und es gibt keine Funktion, die im Grunde die Benutzer lesen kann, wenn der Benutzer denkt "das ist es, nicht mehr Daten".

Neben der obigen Lösung, die der Benutzer ein "Dateiende" geben soll, können Sie andere Sequenzen oder spezielle Tasten oder sogar Phrasen der Eingabe verwenden, um das Ende zu markieren, aber es kommt darauf an: Eingabe lesen in a Schleife, bis Benutzer "keine Eingabe mehr" sagen.

Verwandte Themen