编写一个程序,将输入读取到#并报告序列ei发生的次数

时间:2014-07-01 11:11:28

标签: c if-statement controls branch

编写一个程序,将输入读取到#并报告序列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的新人

3 个答案:

答案 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
  • EOF /输入错误的无限循环。

随机事实:

  • main在结束括号之前有一个隐含的return 0;
  • getchar()返回int,因此失败时返回-1,成功时转换为unsigned char。始终检查是否有失败。
  • 逻辑和比较运算符始终返回0或1。
  • 0是逻辑错误,其他所有逻辑都是真的。
  • 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;会发生什么。