Created
February 24, 2019 09:13
-
-
Save Austio/8ec4d64b39dfc7e644b8f6cd95f65bd1 to your computer and use it in GitHub Desktop.
memory safe get io
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#define OK 0 | |
#define NO_INPUT 1 | |
#define TOO_LONG 2 | |
#define SMALL_BUFF 3 | |
// https://stackoverflow.com/questions/2430303/disadvantages-of-scanf | |
static int getLine (char *prmpt, char *buff, size_t sz) { | |
int ch, extra; | |
// Size zero or one cannot store enough, so don't even | |
// try - we need space for at least newline and terminator. | |
if (sz < 2) | |
return SMALL_BUFF; | |
// Output prompt. | |
if (prmpt != NULL) { | |
printf ("%s", prmpt); | |
fflush (stdout); | |
} | |
// Get line with buffer overrun protection. | |
if (fgets (buff, sz, stdin) == NULL) | |
return NO_INPUT; | |
// If it was too long, there'll be no newline. In that case, we flush | |
// to end of line so that excess doesn't affect the next call. | |
size_t lastPos = strlen(buff) - 1; | |
if (buff[lastPos] != '\n') { | |
extra = 0; | |
while (((ch = getchar()) != '\n') && (ch != EOF)) | |
extra = 1; | |
return (extra == 1) ? TOO_LONG : OK; | |
} | |
// Otherwise remove newline and give string back to caller. | |
buff[lastPos] = '\0'; | |
return OK; | |
} | |
And, a test driver for it: | |
// Test program for getLine(). | |
int main (void) { | |
int rc; | |
char buff[10]; | |
rc = getLine ("Enter string> ", buff, sizeof(buff)); | |
if (rc == NO_INPUT) { | |
// Extra NL since my system doesn't output that on EOF. | |
printf ("\nNo input\n"); | |
return 1; | |
} | |
if (rc == TOO_LONG) { | |
printf ("Input too long [%s]\n", buff); | |
return 1; | |
} | |
printf ("OK [%s]\n", buff); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment