fget 和 gets 之间的区别

pur*_*ure 5 c gets scanf fgets

fgets()和 和有什么区别gets()

当用户点击“输入”时,我试图打破循环。它与 配合得很好gets(),但我不想使用gets()。我尝试使用fgets()andscanf()但没有得到与使用相同的结果gets()fgets()无论用户在文本中输入什么,都会打破循环!这是我的代码:

void enter(void)
{
  int i,

  for(i=top; i<MAX; i++)
    {
      printf(".> Enter name (ENTER to quit): ");
      gets(cat[i].name);

      if(!*cat[i].name)
         break;

      printf(".> Enter Last Name: ");
      scanf("%s",cat[i].lastname);
      printf(".> Enter Phone Number: ");
      scanf("%s",cat[i].phonenum);
      printf(".> Enter e-Mail: ");
      scanf("%s",cat[i].info.mail);
      printf(".> Enter Address: ");
      scanf("%s",cat[i].info.address);
      printf("\n");
    }
  top = i;
}
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 3

放下gets() scanf().
创建一个辅助函数来处理和限定用户输入。

// Helper function that strips off _potential_ \n
char *read1line(const char * prompt, char *dest, sizeof size) {
  fputs(prompt, stdout);
  char buf[100];
  *dest = '\0';
  if (fgets(buf, sizeof buf, stdin) == NULL) {
    return NULL;  // EOF or I/O error
  }
  // Remove potential \n
  size_t len = strlen(buf);
  if (len > 0 && buf[len-1] == '\n') {
    buf[--len] = `\0`;
  }
  // Line is empty or too long
  if (len == 0 || len >= size) return NULL;
  return memcpy(dest, buf, len+1);
}

void enter(void)
{
  int i;

  for(i=top; i<MAX; i++)
    {
      if (read1line(".> Enter name (ENTER to quit): ", 
          cat[i].name, sizeof cat[i].name) == NULL) break;
      if (read1line(".> Enter Last Name: ", 
          cat[i].lastname, sizeof cat[i].lastname) == NULL) break;
      if (read1line(".> Enter Phone Number: ", 
          cat[i].phonenum, sizeof cat[i].phonenum) == NULL) break;
      if (read1line(".> Enter e-Mail: ", 
          cat[i].info.mail, sizeof cat[i].info.mail) == NULL) break;
      if (read1line(".> Enter Address: ", 
          cat[i].info.address, sizeof cat[i].info.address) == NULL) break;
    }
  top = i;
}
Run Code Online (Sandbox Code Playgroud)

fgets()和的一些属性gets()

fgets()读取输入并保存到缓冲区,直到:
1) 缓冲区即将满 - 或 -
2)'\n'遇到 - 或 -
3) 流达到文件结束条件 - 或 -
4) 发生输入错误。

gets()执行上面的 #2 - #4 ,但它会扫描,但不会保存'\n'.
gets()在 C99 中已贬值,不再是 C11 的一部分。