TheBoxOkay TheBoxOkay - 21 days ago 8
C Question

Reading in a string with spaces in C

I am trying to read in a string that may or may not include spaces ex. "hello world". By doing the following with a number select menu that is inputted by the user. This is just a small replica of what I am trying to do.

#include <stdio.h>
#include <string.h>

int main(void){
char line[3][80];

strcpy(line[0],"default line 1\n");
strcpy(line[1],"default line 2\n");
strcpy(line[2],"default line 3\n");

for(int i = 0; i < 3; i++){
printf("%s", line[i]);
}

int option = 0;
printf("would you like to replace line 1? (1 for yes)\n");
scanf("%d",&option);
if(option==1){
printf("what would you like to replace the line with?\n");
fgets(line[0],strlen(line[0]),stdin);
}

for(int i = 0; i < 3; i++){
printf("%s", line[i]);
}
}


Why is it that after I enter 1 to change the line, it prints the statement asking what I want to replace it with and will automatically enter nothing then printing the strings with the first one as empty?

I also have already tried reading the line with
sscanf("%[^\n\t]s", line[0]);
without any luck. Any ideas?

usr usr
Answer

It's because

scanf("%d",&option);

leaves the \n character in stdin and is consumed by the first call to fgets(). That's why it's best to avoid scanf() in C completely.

You can fix it with:

  scanf("%d",&option);
  getchar(); /* consume the newline */

But I'd suggest using fgets() to read option as well and then you can use strtol() to convert it into an integer.

Note that this statement is not probably what you intended (which limits what you can read into line[0]).

   fgets(line[0],strlen(line[0]),stdin);

You probably meant to use:

   fgets(line[0],sizeof line[0],stdin);

so that you can read upto the actual size of line[0].

Please read the C Faq entry as well: http://c-faq.com/stdio/scanfprobs.html

Comments