Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这两种方法返回不同的东西?_C_Stdin_Printf_Fgetc - Fatal编程技术网

C 为什么这两种方法返回不同的东西?

C 为什么这两种方法返回不同的东西?,c,stdin,printf,fgetc,C,Stdin,Printf,Fgetc,所以…我试着制作我自己的简单键盘记录器,它适用于在shell中键入的东西,但是如果我双击可执行文件,它会在文件中放入很多这样的东西:ÿ 我明白,从现在起,如果我输入aj,它将结束;这是用于调试的: #包括 #包括 #包括 内部主(空) { 文件*fp=fopen(“log”,“w”); 如果(fp!=NULL) { int x=0; 而(x==0) { 字符输入=fgetc(标准输入); 如果(输入=*“j”) x=1; 其他的 { fprintf(fp,“%c\n”,输入); } } fc

所以…我试着制作我自己的简单键盘记录器,它适用于在shell中键入的东西,但是如果我双击可执行文件,它会在文件中放入很多这样的东西:
ÿ

我明白,从现在起,如果我输入aj,它将结束;这是用于调试的:


#包括
#包括
#包括
内部主(空)
{ 
文件*fp=fopen(“log”,“w”);
如果(fp!=NULL)
{
int x=0;
而(x==0)
{
字符输入=fgetc(标准输入);
如果(输入=*“j”)
x=1;
其他的
{
fprintf(fp,“%c\n”,输入);
}
}
fclose(fp);
}
返回0;
}

可能是因为双击时没有输入流,或者直接是空的。在这些条件下,
fgetc
将连续返回
EOF
。我不能肯定这一点,但它解释了你看到的症状

您需要将
input
EOF
进行比较,以查看是否找到了流的结尾,因为在这种情况下,您将永远没有机会输入
j
。尝试更改:

if (input==*"j")
致:

(您会注意到,我已经将非常不寻常的
*“j”
xonstruct更改为更简单的
'j'


fgetc
的返回值也应该是
int
,因为它必须表示每一个可能的字符加上
EOF

,这可能是因为双击时没有输入流,或者直接为空。在这些条件下,
fgetc
将连续返回
EOF
。我不能肯定这一点,但它解释了你看到的症状

您需要将
input
EOF
进行比较,以查看是否找到了流的结尾,因为在这种情况下,您将永远没有机会输入
j
。尝试更改:

if (input==*"j")
致:

(您会注意到,我已经将非常不寻常的
*“j”
xonstruct更改为更简单的
'j'

fgetc
的返回值也应该是
int
,因为它必须表示每个可能的字符加上
EOF

请注意,
fgetc()
需要一个
int
(好吧,通常大于
char
--
int
的值)作为其返回值:
EOF
是除
char
可能采用的任何值之外的一个可能的返回值

哎呀,这太尴尬了。:)角色比较(如果在本例中可以的话)如下所示:

if (input == 'j')
了解
'
字符和
'
字符串之间的区别对于成为一名优秀的程序员至关重要。在自由形式的
'string'
“string”
“string”
其他脚本语言的各种行为之后,它可能会感觉很僵硬,但事实就是这样

通常,这些类型的程序使用不同的布局编写:

int c;
while((c = getchar()) != EOF) {
    /* do something with c */
}
将作业和测试放在
的条件下,
一开始可能会觉得奇怪,但这是惯用的。(在禁止这种行为的语言中,我非常怀念这种行为。)

请注意,
fgetc()
需要一个
int
(好吧,通常大于
char
--
int
的值)作为其返回值:
EOF
是除
char
可能采用的任何值之外的一个可能的返回值

哎呀,这太尴尬了。:)角色比较(如果在本例中可以的话)如下所示:

if (input == 'j')
了解
'
字符和
'
字符串之间的区别对于成为一名优秀的程序员至关重要。在自由形式的
'string'
“string”
“string”
其他脚本语言的各种行为之后,它可能会感觉很僵硬,但事实就是这样

通常,这些类型的程序使用不同的布局编写:

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

将作业和测试放在
的条件下,
一开始可能会觉得奇怪,但这是惯用的。(我非常怀念禁止这种行为的语言。)

事实上,*“j”之所以有效,是因为“j”是一个字符串(第一个字符的位置),而且由于*“j”的计算结果是该位置的值,因此它将是字符j@Jack,
*“杰霍瓦的证人”
也可以,但同样奇怪。任何一个好的编译器都可能会将其优化到同样的程度,但它不会阻止继承您代码的程序员质疑您的理智:-)实际上…*“j”起作用,因为“j”是一个字符串(第一个字符的位置),并且由于*“j”的计算结果是该位置的值,因此它将是字符j@Jack,
*“杰霍瓦的证人“
也可以,但同样奇怪。任何一个好的编译器都可能会将其优化到同样的程度,但这不会阻止继承您代码的程序员质疑您的理智:-)所以……这确实解决了问题,但我的问题是,为什么输入流是空的或不存在的?为什么它不断返回EOF?所以…这确实解决了它,但我的问题是,为什么输入流是空的或不存在的?为什么它不断返回EOF?
int c;
while((c = getchar()) != EOF) {
    /* do something with c */
}