簡體   English   中英

fgets和gets之間的區別

[英]Difference between fgets and gets

fgets()gets()什么區別?

當用戶點擊“輸入”時,我試圖打破循環。 它與gets()配合良好,但我不想使用gets() 我嘗試了fgets()scanf()但結果與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;
}

gets()fgets()之間的區別是fgets()將換行符留在緩沖區中。 因此,不是檢查輸入的第一個元素是否為0 ,而是檢查它是否為'\\n'

fgets(cat[i].name, sizeof cat[i].name, stdin);
if (cat[i].name[0] == '\n' || cat[i].name[0] == 0) {
    // empty line or no input at all
    break;
} else {
    // remove the trailing newline
    int len = strlen(cat[i].name);
    cat[i].name[len-1] = 0;
}

刪除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;
}

fgets()gets()一些屬性:

fgets()讀取輸入並將其保存到緩沖區,直到:
1)緩沖區已滿1或-
2)遇到'\\n' n'-或-
3)流達到文件結束條件-或-
4)發生輸入錯誤。

gets()上面的#2-#4, 它會掃描,但不會保存'\\n'
gets()在C99中已貶值,並且不再是C11的一部分。

get和fgets之間的問題區別在於,gets從輸入行中刪除了結尾的'\\ n',但fgets保留了它。

這意味着fgets返回的“空”行實際上是字符串“ \\ n”。

令人討厭的區別是,最好避免完全獲取,如果給出的行太長,則程序將以非常糟糕的方式崩潰。

您可以將fgets()與STDIN結合使用。 此函數是安全的,始終在字符串末尾插入“ \\ 0”。

一個例子:

char inputbuffer[10];
char *p;
p = fgets(inputbuffer, sizeof(inputbuffer), stdin);
printf(">%s<\n", p);    /* p is NULL on error, but printf is fair */

在此示例中,您最多可獲得9個字符+'\\ 0'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM