2011-06-11 106 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

相关问题