Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read a string entered by the user in C?

Tags:

c

stdin

I want to read the name entered by my user using C programmes.

For this I wrote:

char name[20];  printf("Enter name: "); gets(name); 

But using gets is not good, so what is a better way?

like image 408
Peeyush Avatar asked Oct 26 '10 13:10

Peeyush


People also ask

What is read input from user in C?

In C programming, scanf() is one of the commonly used function to take input from the user. The scanf() function reads formatted input from the standard input such as keyboards.

Which function are used to read a string from user?

Using getchar() function: In order to read a string, we have to use this function repeatedly until a terminating character is encountered.

How do you read and write strings in C?

C provides two basic ways to read and write strings. input/output functions, scanf/fscanf and printf/fprintf. Second, we can use a special set of string-only functions, get string (gets/fgets) and put string ( puts/fputs ).


2 Answers

You should never use gets (or scanf with an unbounded string size) since that opens you up to buffer overflows. Use the fgets with a stdin handle since it allows you to limit the data that will be placed in your buffer.

Here's a little snippet I use for line input from the user:

#include <stdio.h> #include <string.h>  #define OK       0 #define NO_INPUT 1 #define TOO_LONG 2 static int getLine (char *prmpt, char *buff, size_t sz) {     int ch, extra;      // Get line with buffer overrun protection.     if (prmpt != NULL) {         printf ("%s", prmpt);         fflush (stdout);     }     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.     if (buff[strlen(buff)-1] != '\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[strlen(buff)-1] = '\0';     return OK; } 

This allows me to set the maximum size, will detect if too much data is entered on the line, and will flush the rest of the line as well so it doesn't affect the next input operation.

You can test it with something like:

// 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; } 
like image 96
paxdiablo Avatar answered Sep 21 '22 19:09

paxdiablo


I think the best and safest way to read strings entered by the user is using getline()

Here's an example how to do this:

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) {     char *buffer = NULL;     int read;     unsigned int len;     read = getline(&buffer, &len, stdin);     if (-1 != read)         puts(buffer);     else         printf("No line read...\n");      printf("Size read: %d\n Len: %d\n", read, len);     free(buffer);     return 0; } 
like image 29
joaopauloribeiro Avatar answered Sep 17 '22 19:09

joaopauloribeiro