读取带有C空格的字符串

The*_*kay 6 c scanf fgets

我试图读取一个字符串,可能包括也可能不包括空格ex."你好,世界".通过用户输入的数字选择菜单进行以下操作.这只是我想要做的一个小复制品.

#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]);
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么在我输入1更改行之后,它会打印语句询问我想要替换它的内容并自动输入任何内容然后打印字符串,第一个字符串为空?

我也试过sscanf("%[^\n\t]s", line[0]);没有运气就读过这条线.有任何想法吗?

usr*_*usr 10

这是因为

scanf("%d",&option);
Run Code Online (Sandbox Code Playgroud)

将\n字符留在stdin中,并在第一次调用时使用fgets().这就是为什么最好scanf()完全避免使用C语言.

你可以修复它:

  scanf("%d",&option);
  getchar(); /* consume the newline */
Run Code Online (Sandbox Code Playgroud)

但我建议使用也fgets()可以读取option,然后你可以用strtol()它来转换成整数.

请注意,此声明可能不是您的意图(这限制了您可以阅读的内容line[0]).

   fgets(line[0],strlen(line[0]),stdin);
Run Code Online (Sandbox Code Playgroud)

你可能想要使用:

   fgets(line[0],sizeof line[0],stdin);
Run Code Online (Sandbox Code Playgroud)

这样你就可以读到实际大小了line[0].

请阅读C Faq条目:http://c-faq.com/stdio/scanfprobs.html

  • 我确认,`scanf`很糟糕,这类问题很常见.Google _scanf是邪恶的(不是开玩笑)以获取更多信息. (3认同)