簡體   English   中英

在C中使用fgets函數

[英]Usage of fgets function in C

我編寫自己的UNIX Shell的任務之一。 為了接收來自用戶的輸入,我使用fgets將輸入捕獲為字符串,但我不確定它是如何工作的。 當我跑:

char command[50];
fgets(command, sizeof(command), stdin);

printf("Your Command: %s", &command);
int length = strlen(command);
printf("Length of String: %d\n", length);

讓我說我的輸入是“退出”。 strlen說字符串是5個字符長,而不是4個字符。 我想做這個:

if( (strcmp(command, "exit")) == 0 ){
    doSomething();
}

但命令永遠不會等於我想要它的字符串; 就像它有一個我不確定的未知角色。 最后是空字符嗎? 如何更改if語句以檢查用fgets捕獲的用戶輸入是否等於“退出”? 謝謝!

fgets將行終止符視為有效字符。 這是你收到的額外角色。

只需執行command[strlen(command) - 1] = '\\0'; 刪除行終止符。 然后你就可以自由地完成你所有的strcmp

fgets手冊頁:

fgets()從流中讀取最多一個小於大小的字符,並將它們存儲到s指向的緩沖區中。 讀數在EOF或換行符后停止。 如果讀取換行符,則將其存儲到緩沖區中。 在緩沖區中的最后一個字符之后存儲'\\ 0'。

結論:比較時,字符串末尾有一個額外的換行符。

fgets將始終在輸入字符串中包含行終止字符。 您可以通過執行以下操作從“命令”末尾刪除任何空格(包括換行符):

char command[50];
fgets(command, sizeof(command), stdin);

size_t length = strlen(command);
// Trim off trailing "spaces" including newline characters
while ((length > 0) && isspace(command[length-1]))
      command[--length] = '\0';

printf("Your Command: %s\n", &command); // Include newline now...
// This is computed above...
// int length = strlen(command);

// Continue as before

fgets也在捕捉換行符。

請注意,您可以通過幾種方式克服此問題,可能是使用strncmp

if((strncmp(command, "exit", 4)) == 0)

檢查命令的前4個字符是否匹配(盡管這可能不適合您)。

另一種策略是檢查換線:

if((strcmp(command, "exit\n")) == 0)

可能最簡單的方法是切換到使用scanf來讀取輸入:

char command[51];

scanf("%50[^\n]", command);

if (0 == strcmp(command, "exit"))
    do_something();

你的字符串最后仍然有換行符。 您可以與"exit\\n"進行比較,或者使用類似strncmp(command, "exit", 4) 請注意,這將接受以“exit”開頭的任何內容並忽略其余內容。

如上所述, fgets (3)為您提供尾隨'\\ n'。 如果使用gets (3),則不會獲得尾隨換行符。 沒有像一致性,sez I.

Perl有一個hand chomp()函數可以修剪尾隨的換行符 - 如果它存在的話 - 你可能會比滾動自己更糟糕:

#define NUL ((char)0)
void chomp( char *s )
{
  if ( s != null )
  {
    int len = strlen(s) ;
    if ( len >= 1 && s[len-1] == "\n" )
    {
      s[len-1] = NUL ;
    }
  }
  return ;
}

暫無
暫無

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

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