忽略c中的前导换行符(“\ n”)

时间:2018-02-04 21:47:20

标签: c newline fgets

我目前正在进行练习。我的程序正在运行,我只想让它更加强大和万无一失。代码如下:

printf("Enter Name : ");
memset(userinput, '\0', 50);
fgets(userinput, 50, stdin);

我不小心点击了输入键(换行符),对于我的程序,系统只是悬挂在那里,无法接受任何输入。我只被允许使用fgets。那么有没有办法拒绝将\n作为字段输入?

2 个答案:

答案 0 :(得分:3)

你可以做的一种方法是检查第一个字符是否是换行符:

do {
    printf("Enter Name : ");
    memset(userinput, '\0', 50);
    fgets(userinput, 50, stdin);
}
while ( userinput[0] == '\n'); 

printf("Hello %s", userinput);

这仍然会让你达到空间+换行符,但它是第一次开始。

答案 1 :(得分:0)

  

那么有没有办法拒绝将\ n作为字段输入?   ...使其更加强大和万无一失。

代码不应阻止 '\n'通过fgets()阅读。相反,代码应该评估该输入的有效性。领先'\n'可能只有一个问题。使代码易于更新,因为有效名称的标准肯定会发生变化。

我建议单独进行名称测试。

bool ValidNameInputTest(const char *userinput) {
  if (*userinput == '\n') return false; // fail
  // add other tests as needed
  return true;
}

在循环中,根据需要进行测试和重复。代码应该在成功时退出循环。当发生文件结束或输入错误时,代码也应该检测/处理它。

...
char userinput[50];

do {
  printf("Enter Name : ");
  fflush(stdout);   // add to insure above output is seen before reading input
  //memset(userinput, '\0', 50);// Commented out as not needed - although useful for debug

  // Check return value and used a derived size
  //fgets(userinput, 50, stdin);
  if (fgets(userinput, sizeof userinput, stdin) == NULL) {
    Handle_EndOfFile_or_Error();
  }
} while (!ValidNameInputTest(userinput));