2011-06-04 24 views
1

编写一个程序,将输入读入到#并报告序列ei出现的次数。C编程问题 - 分支

我有一个为'ieei'序列,有点慌乱,其中编译器并进入第3 'e',但从未取得'i'getchar(),为什么,如果有人能够自己之前改善这一点,会是好?

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"); 
+0

你'char'(和一个在到目前为止一切的答案):应该是一个'int'。 'getchar()'专门返回一个'int'来通知调用者一个错误(或EOF)。将从'getchar()'返回的值转换为'char'类型可以有效地禁止在输入*中检测到错误(或EOF)(或者某些有效字符被错误解释)* – pmg 2011-06-04 19:28:41

+1

这是功课吗? – 2011-06-04 19:43:08

+0

添加了作业标签。如果错误请删除。 (家庭作业问题没有问题,特别是这样问)。 – 2011-06-04 19:46:54

回答

5

在我看来这是最简单的保留最近getchar()的结果在一个变量,而不是有你的循环内的额外getchar()

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

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

这给出正确的结果无论怎样的许多e行或什么的,休息在第一#字符。

+0

内部不检查'#',内部getchar只能提取下一个char – highlevelcoder 2011-06-04 09:43:10

+3

@highlevelcoder,但是如果内部getchar得到一个'#',就会失败,并且在你的问题语句中什么都不排除'“abcde #youshouldn'tbereadingthis“'。简单地实现一个记忆最后一次读取结果的状态机是最简单的。 – sverre 2011-06-04 09:44:37

+0

我同意上面的说法,我只是试验 – highlevelcoder 2011-06-04 09:47:50

0

我很想实现它:

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!='#'); 
+0

如果输入“eei#”,那么'sq'仍然为0. – pickypg 2011-06-04 19:27:42

+0

你是对的。修正了(在'if语句中有更多的控制流程)。 – trutheality 2011-06-04 19:37:35

+2

这确实很混乱。编写这样的代码没有意义。 – 2011-06-04 19:50:07