编写一个程序,将输入读取到#并报告序列ei出现的次数
我有这个问题,我在这里找到了一个代码,但是我无法弄清楚int c1部分的作用。这是代码:
#include <stdio.h>
int main(void) {
int c;
int ei_count = 0;
while ((c = getchar())!= '#') {
if (c == 'e') {
int c1 = getchar();
if (c1 == 'i')
ei_count++;
}
}
printf("ei appeared %d times\n", ei_count);
return(0);
}
我的问题是,if条件是如何工作的?有人可以解释一下吗? 我是C的新人
答案 0 :(得分:2)
c1
- 部分在扫描ei
的第二部分时失败,他们可以重复使用c
而不会引入更多错误。
更好的选择:
#include <stdio.h>
int main(void) {
int c, last = 0, ei_count = 0;
while ((c = getchar()) >= 0 && c != '#') {
ei_count += last && c == 'i';
last = c == 'e';
}
printf("ei appeared %d times\n", ei_count);
}
纠正错误:
ei
之后无法识别#
或e
。随机事实:
main
在结束括号之前有一个隐含的return 0;
。getchar()
返回int
,因此失败时返回-1,成功时转换为unsigned char
。始终检查是否有失败。return
不是函数调用:使用不带括号的return 0;
。答案 1 :(得分:0)
你提到的这个部分是一种找到类似&#34; ei&#34;的模式的方法。在第一时间,代码试图找到&#39; e&#39;循环中的字符,然后,一旦找到它,代码将检查下一个字符是否是字母&#39; i&#39;。不是的情况下,再次开始寻找另一个&#39; e&#39;炭。
这不是一个好方法,因为在getchar()操作期间没有错误验证,你可能会陷入无限循环。
答案 2 :(得分:0)
过度简化,它只是一个状态机。
逐行逐步:
while ((c = getchar())!= '#') {
读取输入并将其分配给变量c
。如果在char中读取的内容不是#
,则执行while的主体,否则跳过它。
if (c == 'e') {
如果读入字符是e
,那么我们想要执行内部块。如果不是,请跳到此块的末尾。
int c1 = getchar();
阅读另一个角色。
if (c1 == 'i') ei_count++;
如果新字符是i,则递增找到的项目的计数器。
}
关闭if(如果找到e)
}
关闭。
值得指出的是,逻辑流程中存在一个非常明显的缺陷。想想如果你有输入&#34; eei&#34;会发生什么。