C 我们可以让while循环同时测试两个参数而不使用&&/||
我正在查看Beej的指南,一行代码引起了我的注意 在特定页面中,C 我们可以让while循环同时测试两个参数而不使用&&/||,c,ipc,C,Ipc,我正在查看Beej的指南,一行代码引起了我的注意 在特定页面中,speak.c中的while循环有两个条件来检查while(get(s),!feof(stdin)) 所以我的问题是,这是怎么可能的,就像我在大多数情况下只测试一种情况时看到的那样 附言:我对这些有点陌生。我将非常感谢您的帮助。谢谢 片段 while (gets(s), !feof(stdin)) 使用逗号运算符,首先执行get(s),然后测试!feof(stdin),这是该条件的结果 顺便说一句,不要使用gets,这是非常不安全
speak.c
中的while循环有两个条件来检查while(get(s),!feof(stdin))
所以我的问题是,这是怎么可能的,就像我在大多数情况下只测试一种情况时看到的那样
附言:我对这些有点陌生。我将非常感谢您的帮助。谢谢 片段
while (gets(s), !feof(stdin))
使用逗号运算符,首先执行get(s)
,然后测试!feof(stdin)
,这是该条件的结果
顺便说一句,不要使用gets,这是非常不安全的。小心使用它的资源,它们可能不是学习语言的好资源
代码
while(gets(s), !feof(stdin)) {
/* loop body */
}
相当于
gets(s);
while(!feof(stdin)) {
/* loop body */
gets(s);
}
更简洁,因为它避免了在循环之前和循环体中重复
get
。此测试使用,并已被用作使用get
获取下一行文本的方法,以及使用测试文件结尾!feof(stdin)
此语法不计算两个表达式。它首先执行获取的,然后计算!feof(stdin)
可以通过gets()
函数调用对其进行修改
这不是一个很好的方法,因为它都使用了get()
,这不是一个安全的函数,对于初学者来说读起来很不方便(这就是你的问题)。一些人已经指出了其中的一些问题。我当然同意使用get
(完全)是一个糟糕的想法
不过,我认为值得一提的是另一个细节:由于这使用了feof(file)
作为退出循环的条件,因此如果在文件结束之前遇到错误,它也可能/将表现不好。当发生错误时,将设置错误标志,但(通常)不会设置EOF标志,并且由于您无法再从文件中读取(由于错误),因此也不会设置错误标志,因此这将进入无限循环
正确的方法是使用fgets
,并检查其返回值:
while (fgets(s, length_of_s, stdin))
process(s);
这将测试从文件读取时是否成功执行fgets
,因此它将退出文件结尾或错误的循环
另一个次要细节是:当fgets
读取字符串时,它通常会在行尾保留新行(其中获取
将其丢弃)。如果有新行,您可能需要添加更多的代码来删除它(如果新行不存在,则可能需要处理比您分配的缓冲区长的行)。如果您发现1990年之后编写的书籍/指南使用了get
任何东西,您应该烧掉它。作者是无能的,你会从阅读他们的例子中发现非常坏的习惯…@R。。Beej的指南是一个f#king暴行,应该从互联网上删除,引用的代码应该是他在海牙的死刑审判中的附件a。哇,真是太糟糕了……请注意,如果代码的原始版本没有换行,它会丢弃文件的最后一行。