Well, since stdin
is a buffered input, you can use fgetc
to read an input character by character until you hit a new line or EOF. Perhaps you are looking for something like this:
#include <stdlib.h> #include <string.h> #include <stdio.h> struct friend { char *firstname; char *lastname; char birthdate[9]; }; static char *read_line(FILE *f) { char *r = NULL; char *p = r; char *e = p; int c; while ((c = fgetc(f)) != EOF) { if (p >= e) { size_t l = e > r ? (size_t)(e - r) : 32u; char *x = realloc(r, l); if (!x) { free(r); r = NULL; goto out; } p = x + (p - r); e = x + l; r = x; } if (c != '\n') { *p++ = (char)c; } else { *p++ = '\0'; goto out; } } if (ferror(f) != 0) { free(r); r = NULL; } out: return r; } int main(void) { struct friend f; memset(&f, 0, sizeof(struct friend)); printf("Please enter your first name: "); fflush(stdout); f.firstname = read_line(stdin); if (!f.firstname) goto on_error; printf("Please enter your last name: "); fflush(stdout); f.lastname = read_line(stdin); if (!f.lastname) goto on_error; printf("You first name is: %s\n", f.firstname); printf("Your last name is: %s\n", f.lastname); free(f.firstname); free(f.lastname); return EXIT_SUCCESS; on_error: perror("read_line"); free(f.firstname); free(f.lastname); return EXIT_FAILURE; }
user405725
source share