C程序设计问题-分支

C程序设计问题-分支,c,C,编写一个程序,将输入读取到#,并报告序列ei出现的次数 我对序列没有什么混淆,比如编译器输入第三个'e',但从不使用getchar()获取'I',为什么,如果有人能在我之前改进这一点就好了 char ch; int sq=0; while ((ch = getchar()) != '#') { if (ch == 'e') { ch = getchar(); if (ch == 'e') ch = getchar();

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

我对序列没有什么混淆,比如编译器输入第三个
'e'
,但从不使用
getchar()
获取
'I'
,为什么,如果有人能在我之前改进这一点就好了

char ch;
int sq=0;

while ((ch = getchar()) != '#')
{
    if (ch == 'e')
    {
        ch = getchar();

        if (ch == 'e')
            ch = getchar();

        if (ch == 'i')
            sq++;
    }
}

printf("Sequence occurs %d %s\n", sq, sq == 1 ? "time" : "times");

在我看来,最简单的方法是将最后一个
getchar()
的结果保存在一个变量中,而不是在循环中有一个额外的
getchar()

char ch;
int sq=0;
char lastCh = ' ';

while((ch=getChar())!='#') {
  if(lastCh=='e' && ch=='i')
    sq++;
  lastCh=ch;
}

无论一行中有多少个
e
,这都会给出正确的结果,并在第一个
#
字符处中断。

在我看来,最简单的方法是将最后一个
getchar()
的结果保存在一个变量中,而不是在循环中有一个额外的
getchar()

char ch;
int sq=0;
char lastCh = ' ';

while((ch=getChar())!='#') {
  if(lastCh=='e' && ch=='i')
    sq++;
  lastCh=ch;
}

无论一行中有多少个
e
,并且在第一个
#
字符处中断,这都会给出正确的结果。

我尝试将其实现为:

char ch=0;
int sq=0;

do{
    if( (ch=( ch=='e'? ch:getchar() )) == 'e' && (ch=getchar()) == 'i' )
        ++sq;
}while(ch!='#');
但是它使用
?:
&&&
作为控制流,这可能会让初学者感到困惑

仔细想想,展开它并不难:

char ch=0;
int sq=0;

do{
    if( ch!='e' ) ch = getchar();

    if( ch == 'e' ){

        ch = getchar();

        if( ch == 'i' ) ++sq;
    }

}while(ch!='#');

我很想将其实现为:

char ch=0;
int sq=0;

do{
    if( (ch=( ch=='e'? ch:getchar() )) == 'e' && (ch=getchar()) == 'i' )
        ++sq;
}while(ch!='#');
但是它使用
?:
&&&
作为控制流,这可能会让初学者感到困惑

仔细想想,展开它并不难:

char ch=0;
int sq=0;

do{
    if( ch!='e' ) ch = getchar();

    if( ch == 'e' ){

        ch = getchar();

        if( ch == 'i' ) ++sq;
    }

}while(ch!='#');

检查内部“#”不是目的,内部getchar的唯一目的是获取下一个char@highlevelcoder但是,如果内部getchar得到一个
,那么您就输了,并且您的问题陈述中没有任何内容可以排除
“abcde”
。简单地实现一个能记住上次读取结果的状态机是最容易的。我同意上面的说法,我只是在尝试添加一点,#无论如何都应该停止循环执行,这就是为什么我不介意。执行/读取直到#检查内部的“#”不是目的,内部getchar只有获取下一个的目的char@highlevelcoder但是,如果内部getchar得到一个
,那么您就输了,并且您的问题陈述中没有任何内容可以排除
“abcde”
。简单地实现一个能记住上次读取结果的状态机是最容易的。我同意上面的说法,我只是在尝试添加一点,#无论如何都应该停止循环执行,这就是为什么我不介意。执行/读取直到#如果您输入“eei#”,那么
sq
仍然是0。您是对的。修正了(在
if
语句中增加了一些控制流)。这确实非常混乱。写这样的代码是没有意义的。@Alexandre然后提出你自己的观点,这家伙至少表现出了一些努力!我不是选民。我只是觉得这个代码(第一个版本)很难阅读。如果你输入“eei#”,那么
sq
仍然是0。你是对的。修正了(在
if
语句中增加了一些控制流)。这确实非常混乱。写这样的代码是没有意义的。@Alexandre然后提出你自己的观点,这家伙至少表现出了一些努力!我不是选民。我只是觉得这个代码(第一个版本)非常不可读。你的
char
(以及到目前为止每个答案中的一个)应该是
int
getchar()
返回一个
int
,专门用于通知调用方错误(或EOF)。将从
getchar()
返回的值转换为type
char
可以有效地禁用对添加的作业标记中的输入错误(或EOF)的检测。如果错误,请删除。(家庭作业问题没问题,特别是这样问)。这不是家庭作业,为什么会是?!您的
char
(以及到目前为止每个答案中的一个)应该是
int
getchar()
返回一个
int
,专门用于通知调用方错误(或EOF)。将从
getchar()
返回的值转换为type
char
可以有效地禁用对添加的作业标记中的输入错误(或EOF)的检测。如果错误,请删除。(家庭作业问题没问题,特别是这样问)。这不是家庭作业,为什么会是?!