Diptarag
Diptarag

Reputation: 133

Taking some string input from user with C

I am not too familiar with C syntax. I need to process some data based on user input. Although I processed the data successfully but I am stuck at user input section. I removed the unnecessary data processing section and made a simple example of how I am taking the user input. Can anyone tell me what's the problem with below code :

int i, number;
char *str;
str=(char*)malloc(1000*sizeof(char));
printf("Enter count : ");
scanf("%d", &number);
for(i=0; i<number; i++)
{
    printf("\nEnter string: ");
    scanf ("%[^\n]%*c", str);
    printf("%s", str);      
}

Output:

"Enter count : " appears fine, but whenever I provide some value and hit enter it's showing me only 'count' number of Enter string: without enabling user to enter the string.

For example -

Enter count : 2

Enter string:
Enter string:

But if I discard the count input section and provide any fixed value, like

for(i=0; i<5; i++)

it works fine

Thanks in advance

Upvotes: 1

Views: 3784

Answers (3)

Sourav Ghosh
Sourav Ghosh

Reputation: 134326

FYI, there is no issue in for(i=0; i<number; i++), problem is in scanning logic.

Actually, scanf ("%[^\n]%*c", str); is not right. you should use %s to read strings, not %c, which reads a single character, including the ENTER (newline).

Rather, i would suggest, use fgets() for inputs. It's a whole lot better in every way. Check the man page here.

Maybe you can use something like

//Dummy code

int i, number;
char *str;

printf("Enter count : ");
scanf("%d", &number);
str=malloc(number*sizeof(char));   //yes, casting not required
fgets(str, (number-1), stdin );      //"number" is used in different context
fputs(str, stdout);

EDIT:

Working code

#include <stdio.h>
#include <stdlib.h>

#define SIZ 1024

int main()
{
    int i, number;
    char * str = malloc(SIZ * sizeof (char));

    printf("Enter the number :\n");
    scanf("%d", &number);
    getc(stdin);                      //to eat up the `\n` stored in stdin buffer
    for (i = 0; i < number; i++)
    {
        printf("Enter the string %d :", (i+1));
        fgets(str, SIZ-1, stdin);
        printf("You have entered :");
        fputs(str, stdout);
    }

    return 0;
}

Upvotes: 2

Gopi
Gopi

Reputation: 19864

There is a newline character \n after entering count value which is picked up by %c in your scanf() Just use %s to scan strings as shown below.

scanf("%s",str);

If there are spaces in your input.

Then do

char c[50];

fgets(c,sizeof(c),stdin);

Check the below code:

#include <stdio.h>
#include<stdlib.h>
int main(){
   int i, number;
   char *str;
   str=malloc(1000*sizeof(char));
   printf("Enter count : ");
   scanf("%d%*c", &number);
   for(i=0; i<number; i++)
   {   
      printf("\nEnter string: ");
      fgets(str,1000,stdin);
      printf("%s", str);    
   }   
}

Upvotes: 0

Sucho
Sucho

Reputation: 321

scanf("%s",str); Use this instead of the code you are using to take string inputs in a character array.

Upvotes: 0

Related Questions