[英]I don't understand the behavior of fgets in this example
雖然我可以使用字符串,但我想了解為什么我正在處理的這個小示例會以這種方式運行,以及如何解決?
int ReadInput() {
char buffer [5];
printf("Number: ");
fgets(buffer,5,stdin);
return atoi(buffer);
}
void RunClient() {
int number;
int i = 5;
while (i != 0) {
number = ReadInput();
printf("Number is: %d\n",number);
i--;
}
}
從理論上或者至少在我的腦海中,這應該讓我從輸入中讀取5個數字(盡管會覆蓋它們)。
但是事實並非如此,無論如何它都讀取為0。
我知道printf放置了\\ 0空終止符...但我仍然認為我應該能夠讀取第一個數字,而不僅僅是默認情況下為0。而且我不明白為什么其余的數字都可以(並非全為0)。
澄清:我只能讀取4/5數字,第一個始終為0。
編輯:
我已經測試過,看來這是引起問題的原因:
main.cpp中
scanf("%s",&cmd);
if (strcmp(cmd, "client") == 0 || strcmp(cmd, "Client") == 0)
RunClient();
不知何故。
編輯:
如果有人希望編譯,請參見以下代碼。 我仍然不知道如何解決
最終編輯:
無法擺脫錯誤。 決定只添加@ReadInput
int ReadInput(BOOL check) {
...
if (check)
printf ("Number: ");
...
@ RunClient()
void RunClient() {
...
ReadInput(FALSE); // a pseudo - buffer flush. Not really but I ignore
while (...) { // line with garbage data
number = ReadInput(TRUE);
...
}
並稱之為一天。
fgets
讀取輸入以及換行符。 因此,當您輸入數字時,就像: 123\\n
。
轉換失敗時atoi
不會報告錯誤。
從buffer
刪除換行符:
buf[5];
size_t length = strlen(buffer);
buffer[length - 1]=0;
然后,使用strtol
將字符串轉換為數字,以便在轉換失敗時更好地檢測錯誤。
char * fgets ( char * str, int num, FILE * stream );
從流中獲取字符串。
從流中讀取字符,並將它們作為C字符串存儲到str中,直到已讀取(num-1)個字符或到達換行符或到達文件末尾為止,以先發生的為准。
換行符使fgets停止讀取,但該函數將其視為有效字符並包含在復制到str的字符串中。 (這意味着您攜帶\\ n)
復制到str的字符后會自動附加一個終止的空字符。 請注意,fgets與gets有很大的不同:fgets不僅接受流參數,還允許指定str的最大大小,並在字符串中包括任何結尾的換行符。
PD:嘗試使用更大的緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.