Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Funktion um einen String vom Nutzer anzufordern und zurückzugeben.
- //Maxlen definiert dabei die maximale Eingabelänge.
- //Wenn maxlen == 0 ist, so wird jede Länge (< des Buffers) akzeptiert.
- /**
- * @param {char*} returnPointer Zeigt auf das erste Element des übergebenen Char-Buffers
- * @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)
- * @param {int} allowEmptyResponse Darf die Eingabe leer sein?
- */
- char* userInput_getString(unsigned int maxlen,int allowEmptyResponse){
- //Fordere Nutzer auf eine Zeichenkette anzugeben.
- //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.
- char buffer[maxlen+1];
- //Führe diese Schleife aus bis eine korrekte Eingabe erfolgt. Bei Strings ist die einzige mögliche "falsche" Eingabe eine leere Eingabe.
- while(true){
- //fgets() → https://www.geeksforgeeks.org/fgets-gets-c-language/ → Speicher einen CharArray. Dabei wird die Ausgabe nie länger als der angegebene Wert.
- //Dadurch können Bufferoverflow-Angriffe verhindert werden.
- //Lösche jegliche Eingabe im input-Buffer welche von bspw. vorherigen Abfragen übergeblieben sind.
- fflush(stdin);
- //Wenn die Funktion NULL ausgibt ist ein Fehler aufgetreten. In dem Fall soll der Nutzer erneut nach der Eingabe gefragt werden.
- if(fgets(buffer,maxlen,stdin) == NULL){
- consoleChangeColor(Error);
- printf("[FEHLER] Konnte die Eingabe nicht lesen. Bitte versuchen Sie es erneut.\n");
- consoleChangeColor(Default);
- continue;
- }
- //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.)
- stripWhiteSpaces(buffer);
- //Wenn die Eingabe leer ist (also der CharArr an Position 0 den \0-Charakter hat) soll der Nutzer eine neue Eingabe tätigen.
- //fgets() hat die Spezialität, dass bei leerer Eingabe \n zurückgegeben wird. Jedoch wird das \n durch das vorherige Trimmen entfernt.
- if(buffer[0] == '\0' && !allowEmptyResponse){
- consoleChangeColor(Error);
- printf("[FEHLER] Die Eingabe darf nicht leer sein. Bitte versuchen Sie es erneut.\n");
- consoleChangeColor(Default);
- continue;
- }
- //Bestimme die Länge der Eingabe, exklusive NUL
- int len = 0;
- int j = 0;
- while(buffer[j++] != NUL){
- len++;
- }
- if(len == 0)
- return NULL;
- //Überschreibe den eingegebenen String in den übergebenen Buffer.
- //Returnpointer beinhaltet den ersten Char des Rückgabestrings
- char* returnPointer;
- returnPointer = malloc(sizeof(char)*(len+1));
- for(int i = 0;i<maxlen+1;i++){
- returnPointer[i] = buffer[i];
- };
- //Auch hier nochmal den Input-Buffer leeren.
- fflush(stdin);
- return returnPointer;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement