使用 int 作为 EOF 初始化一个 c,然后将其用于 getchar()?

Initialising a c with int as EOF and then using it for getchar()?

提问人:Udar 提问时间:2/27/2020 最后编辑:Udar 更新时间:2/27/2020 访问量:123

问:

标题几乎说明了一切。我有这个家庭作业代码(由讲师发送),用于拼写检查器,我不明白 c 是用 EOF 初始化的 int 然后将其用于 getchar() 的原因?这对我来说是新的,谢谢!(我里面什么都没有,因为把代码放在那里是我的任务,我被上面的问题卡住了)

 int c = EOF;
 while ((c = getchar()) && c != EOF) {

  } 

编辑:我被告知EOF只是为了在没有输入的情况下它不会进入while,但对我来说没有意义,因为如果c不使用getchar,while仍然未使用

c while-loop int eof getchar

评论

0赞 Andrew Henle 2/27/2020
while ((c = getchar()) && c != EOF) {把所有这些塞进一行,你到底能得到什么?
0赞 KamilCuk 2/27/2020
我也看不出初始化的理由。cEOF
1赞 wildplasser 2/27/2020
当遇到 NUL 字符时,我看不出有理由完成循环。
2赞 Lee Daniel Crocker 2/27/2020
c必须是 int,因为这是 getchar() 返回的内容。但是,初始化是无用的,因为它紧随其后的是赋值。
0赞 Udar 2/27/2020
@AndrewHenle也不知道

答:

0赞 chux - Reinstate Monica 2/27/2020 #1

初始化在功能上不是必需的。

它具有具有初始化值的良好属性。可用于调试和避免未初始化的对象错误。但在这种情况下,代码可能是 、 、 、 ....没有功能差异。cint c = 0;int c;int c = EOF;

int c = EOF;
while ((c = getchar()) && c != EOF) {
  ;
}

OP:我被告知 EOF 只是为了在没有输入的情况下它不会进入 while,但对我来说没有意义,因为如果 c 不使用 getchar,while 仍然未使用

如果没有输入,将赋给 ,覆盖 的初始化。在这种情况下,即使没有初始化,也不会输入循环体。c = getchar()EOFcEOFint c = EOF;


现在,辩论可以转移到“应该做什么”上,因为初始化在功能上是不需要的。这个问题和许多类似的问题最好通过您团队的编码标准来解决。缺乏团队标准,跟随客户(教授?缺乏这种领先优势,那就去做以下简单的事情:int c;


while ((c = getchar()) && c != EOF) {是一种反模式,因为它在发生文件末尾或读取 null 字符时停止循环。@wildplasser以下比较常见,但选择取决于您的编码目标。

while ((c = getchar()) != EOF) {

OP:到目前为止,我只在使用 getchar() 时使用 char 初始化了变量,认为它必须是 char。

int getchar(void);通常返回 257 个不同的值,并且 。将其保存到丢失的信息中。用。[0...UCHAR_MAX]EOFcharint

评论

0赞 Udar 2/27/2020
非常感谢!
0赞 M.M 2/27/2020
你为什么把它描述为一种反模式?也许预期的行为正是它所做的。
0赞 chux - Reinstate Monica 2/27/2020
@M.M 看起来类似于读取文件所有字符的公共循环,但又有所不同——这对我有几十年经验的我来说是一个新奇的循环——因此是一种潜在的反模式。它停在 2 个值之一上,但不是读取一行的常见值,因此警告 OP 它可能不是正确的代码似乎很有帮助。诚然,这可能是正确的,但我有合理的怀疑。需要更多的 OP 信息来解决 - 但这更接近另一个问题。while ((c = getchar()) && c != EOF) {whilewhile ((c = getchar()) != '\n' && c != EOF) {