2011-06-11 102 views
1

所以...我試圖讓我自己簡單的鍵盤記錄,這爲工作的事情在shell類型的,但如果我雙擊可執行文件,它只是把很多的這些文件中:ÿ爲什麼這兩種方法返回不同的東西?

我明白到現在如果我輸入一個j它會結束;這是調試:


#include<stdlib.h> 
#include<stdio.h> 
#include<string.h> 


int main(void) 
{ 
FILE *fp = fopen("log", "w"); 
    if (fp != NULL) 
    { 
     int x=0; 
     while (x==0) 
     { 
      char input=fgetc(stdin); 
      if (input==*"j") 
       x=1; 
      else 
      { 
       fprintf(fp, "%c\n",input); 
      } 
     } 
     fclose(fp); 
    } 

return 0; 
} 

回答

3

可能是因爲沒有輸入流,當你雙擊,或者它是空的,立竿見影。在這些情況下,fgetc將連續返回EOF。我不能肯定地說,但它解釋了你所看到的症狀。

您需要比較inputEOF以查看是否已找到流的末尾,因爲在這種情況下,您將永遠不會有機會輸入j。嘗試改變:

if (input==*"j") 

到:

if ((input == 'j') || (input == EOF)) 

(你會注意到我已經改變了,而...不尋常的*"j" xonstruct更簡單的'j'爲好)。

fgetc的返回值也應該是一個int,因爲它代表每一個可能的字符EOF

+0

+1實際提及輸入流。 :) – sarnold 2011-06-11 01:18:57

+0

所以......這確實解決了它,但我的問題是爲什麼輸入流爲空或不存在?爲什麼它不斷返回EOF? – JacKeown 2011-06-11 01:41:40

1
char input=fgetc(stdin); 

請注意,fgetc()需要int(當然,東西比char更大 - int習慣),其返回值:EOF是除了任何值的可能的返回值那char可能需要。

if (input==*"j") 

哎呀,這尷尬。 :)字符比較(如果是在這種情況下還行)看起來像:

if (input == 'j') 

知道之間的''字符和字符串""是成爲一個優秀的程序員重要的區別。在從其他腳本語言的自由格式'string'"string""""string"""種行爲之後,它可能會感到高高興興,但事實並非如此。

通常情況下,這些類型的節目都寫有不同的佈局:

int c; 
while((c = getchar()) != EOF) { 
    /* do something with c */ 
} 

把分配並在while的條件測試可能會覺得不可思議在第一,但它是地道的。 (而且我嚴重遺漏了禁止它的語言中的這種行爲。)

+0

其實...... *「j」的作用是因爲「j」是一個字符串(第一個字符的位置),並且由於*「j」的值是該位置的值,所以它就是char j – JacKeown 2011-06-11 01:28:08

+2

@Jack,我知道它_works_,它只是_weird_。 :D – sarnold 2011-06-11 01:29:09

+1

@Jack,'*「jehova的證人」'可以工作,但同樣奇怪。任何體面的編譯器都可能會優化它,但它不會阻止繼承代碼的程序員質疑您的理智:-) – paxdiablo 2011-06-11 01:33:07

相關問題