Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.91 KB | None | 0 0
  1. //Funktion um einen String vom Nutzer anzufordern und zurückzugeben.
  2. //Maxlen definiert dabei die maximale Eingabelänge.
  3. //Wenn maxlen == 0 ist, so wird jede Länge (< des Buffers) akzeptiert.
  4. /**
  5.  * @param {char*} returnPointer Zeigt auf das erste Element des übergebenen Char-Buffers
  6.  * @param {unsigned int} maxlen Die Maximallänge des Eingabestrings. Der größtmögliche Wert ist die Größe des übergebenen Buffers -1 (wegen des \0-Terminators)
  7.  * @param {int} allowEmptyResponse Darf die Eingabe leer sein?
  8.  */
  9. char* userInput_getString(unsigned int maxlen,int allowEmptyResponse){
  10. //Fordere Nutzer auf eine Zeichenkette anzugeben.
  11.  
  12.     //Definiere einen Eingabebuffer. Die Eingabe darf nicht größer als dieser Wert sein. Das +1 wird benötigt, da man Platz für \0 benötigt. Dieser Charakter denotiert das Ende der Strings.
  13.     char buffer[maxlen+1];
  14.     //Führe diese Schleife aus bis eine korrekte Eingabe erfolgt. Bei Strings ist die einzige mögliche "falsche" Eingabe eine leere Eingabe.
  15.     while(true){
  16.         //fgets() → https://www.geeksforgeeks.org/fgets-gets-c-language/ → Speicher einen CharArray. Dabei wird die Ausgabe nie länger als der angegebene Wert.
  17.         //Dadurch können Bufferoverflow-Angriffe verhindert werden.
  18.  
  19.         //Lösche jegliche Eingabe im input-Buffer welche von bspw. vorherigen Abfragen übergeblieben sind.
  20.         fflush(stdin);
  21.         //Wenn die Funktion NULL ausgibt ist ein Fehler aufgetreten. In dem Fall soll der Nutzer erneut nach der Eingabe gefragt werden.
  22.         if(fgets(buffer,maxlen,stdin) == NULL){
  23.             consoleChangeColor(Error);
  24.             printf("[FEHLER] Konnte die Eingabe nicht lesen. Bitte versuchen Sie es erneut.\n");
  25.             consoleChangeColor(Default);
  26.             continue;
  27.         }
  28.         //Hier wird die Eingabe getrimmt, dass heißt das Whitespaces vor und nach Charakteren, welche keine Whitespaces sind, entfernt werden. (whitespaces sind Leerzeichen, \n, \r usw.)
  29.         stripWhiteSpaces(buffer);
  30.         //Wenn die Eingabe leer ist (also der CharArr an Position 0 den \0-Charakter hat) soll der Nutzer eine neue Eingabe tätigen.
  31.         //fgets() hat die Spezialität, dass bei leerer Eingabe \n zurückgegeben wird. Jedoch wird das \n durch das vorherige Trimmen entfernt.
  32.         if(buffer[0] == '\0' && !allowEmptyResponse){
  33.             consoleChangeColor(Error);
  34.             printf("[FEHLER] Die Eingabe darf nicht leer sein. Bitte versuchen Sie es erneut.\n");
  35.             consoleChangeColor(Default);
  36.             continue;
  37.         }
  38.         //Bestimme die Länge der Eingabe, exklusive NUL
  39.         int len = 0;
  40.         int j = 0;
  41.         while(buffer[j++] != NUL){
  42.             len++;
  43.         }
  44.         if(len == 0)
  45.             return NULL;
  46.  
  47.         //Überschreibe den eingegebenen String in den übergebenen Buffer.
  48.         //Returnpointer beinhaltet den ersten Char des Rückgabestrings
  49.         char* returnPointer;
  50.         returnPointer = malloc(sizeof(char)*(len+1));
  51.         for(int i = 0;i<maxlen+1;i++){
  52.             returnPointer[i] = buffer[i];
  53.         };
  54.         //Auch hier nochmal den Input-Buffer leeren.
  55.         fflush(stdin);
  56.         return returnPointer;
  57.  
  58.     }
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement