一道关于计算ei出现次数的题目。

夕槿言 2013-07-15 12:37:33
编写一个程序读取输入,直到#,并报告序列ei出现的次数。
以下是我编写的程序:
#include <stdio.h>
#include <ctype.h>
#define STOP '#'
#define MARK 'e'
#define MARK_NEXT 'i'

int main(void){
char cur;
char cur_low;
char prev;
int count=0;
while((cur=getchar())!=STOP){
cur_low = tolower(cur);
if(cur_low==MARK&&((prev=getchar())==MARK_NEXT)){
count++;
}
}
if(count==1||count==0)
printf("'ei' has appearanced 1 time.");
else
{
printf("'ei' has appearanced %d times.",count);
}
return 0;
}

主要问题是当程序为单数时无法正常结束。
另一点是有时会误认。比如:


不知该如何修改。请各位大大赐教。分数不多了。。所以给的分有点少。希望不要嫌弃。。 谢谢...
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤雲独去闲 2013-07-15
  • 打赏
  • 举报
回复
单数时无法结束是什么意思? 你说的这个误认并没有误认啊

if(count==1||count==0)   //这是你写的,count无论是0和1都是输出1啊
        printf("'ei' has appearanced 1 time.");
LubinLew 2013-07-15
  • 打赏
  • 举报
回复
问题的原因是你在while循环中又调用了getchar导致的.这个违背了你while循环的本意. 另外解决方法欠考虑,你应该记录上一个的值,然后判断当前取到的字符是否是i, 如果是i的话,判断上一个值是不是e.而不是判断当前是e,再判断下一个是否是i.
橡木疙瘩 2013-07-15
  • 打赏
  • 举报
回复
int main(void){
    int cur;//为了判断EOF,cur应该是整型
    char cur_low;
    char prev =0;
    char count=0;
    cur = getchar();//多写一个ch=getchar()并不复杂,没必要把它放在循环条件中
    while ((cur != EOF) && (cur != STOP)){//对输入应该增加EOF的判断
        cur_low = tolower(cur);
        if ((prev == MARK) && (cur_low == MARK_NEXT)){
       //第一次时prev是0,此后prev是上一次的cur_low,不要再去读取。
            count++;
        }
        prev = cur_low;
        cur = getchar();//多写一个ch=getchar()并不复杂,没必要把它放在循环条件中
    }
    if(count==1||count==0)
        printf("'ei' has appearanced %d time.", count);
    else
    {
        printf("'ei' has appearanced %d times.",count);
    }
    return 0;
}
橡木疙瘩 2013-07-15
  • 打赏
  • 举报
回复
单数时无法结束是因为你在一次循环中读了两次数据,但只有循环条件中有对结束输入的判断。
qzf362269994 2013-07-15
  • 打赏
  • 举报
回复
单数是什么意思,是你只输入一个字符码?如果是的话,应该getchar()没读到‘#’字符,当然不会结束 2。把 if(count==1||count==0) printf("'ei' has appearanced 1 time."); else { printf("'ei' has appearanced %d times.",count); } 改为printf("'ei' has appearanced %d times.",count);就行
夕槿言 2013-07-15
  • 打赏
  • 举报
回复
以下是重写的代码(我不知道为什么修改了出现次数为0次的代码之后,连单数无法正常结束的问题都解决了。。)
#include <stdio.h>
#include <ctype.h>
#define STOP '#'
#define MARK 'e'
#define MARK_NEXT 'i'

int main(void){
	char cur;
	char cur_low;
	char next;
	int count=0;
	while((cur=getchar())!=STOP){
		cur_low = tolower(cur);
		if(cur_low==MARK&&((next=getchar())==MARK_NEXT)){
			count++;
		}
	}
	if (count==0||count==1)
		printf("'ei' has appearanced %d time.",count);
	else
		printf("'ei' has appearanced %d times.",count);
	return 0;
}
至于while((cur=getchar())!=STOP)这句话是在C Primer Plus上看来的。。说是比较精简的表达方式。 最后。再次感谢各位大大的指导。特别是4L。。每一句都加了注释。好认真。
夕槿言 2013-07-15
  • 打赏
  • 举报
回复
啊哈哈。。谢谢各位大大。问题原来处在if(count==0||count==1)自己写了这句自己忘了- -。。 5L大大说的其实我也考虑过。。不过尝试多种办法都不能解决。就先在另一个文件里面写了两个getchar试试看。 第一个getchar()是正常读入。第二个getchar会在前一个读入字符为e的情况下再读一个。满足条件则读入下一个字符。 输入reid.#个人理解如下: 相当于顺序是cur_low=r 不满足判断条件→cur_low=e 满足判断条件 进入if prev=gerchar()=i count++→cur_low=i 不满足判断条件→cur_low=d 不满足判断条件→cur_low=.不满足判断条件→cur_low=#结束符 结束循环 然后输出。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧