[英]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.