似乎没有必要将文件读入数组。您只需要在读取或到达 EOFei
之前跟踪找到了多少次:#
#include <stdio.h>
int main(void)
{
int c;
int ei_count = 0;
while ((c = getchar()) != EOF && c != '#')
{
if (c == 'e')
{
int c1 = getchar();
if (c1 == 'i')
ei_count++;
else if (c1 != EOF)
ungetc(c1, stdin);
}
}
printf("ei appeared %d times\n", ei_count);
return(0);
}
测试(程序被调用ei
并由 构建ei.c
):
$ ei < ei.c
ei appeared 0 times
$ sed 1d ei.c | ei
ei appeared 1 times
$ sed 's/#/@/' ei.c | ei
ei appeared 4 times
$
第一个停#include
在行,第二个停在#
比较中,第三个读取整个文件。它还为样本数据提供了正确的输出。
分析代码
您的主要问题是您没有为数组分配任何空间。将数组的维度从 4096 更改为index
4096。这对于您的测试目的来说已经足够大了(但实际上程序应该注意数组而不是溢出它 - 但是我认为数组不是必需的完全没有;参见上面的代码)。
下一个主要问题是,尽管它的名字,getchar()
返回一个int
,而不是一个char
。它可以返回任何有效字符加上一个不同的值 EOF。所以它必须返回一个大于 a 的值char
。(如果您使用char
. 如果char
是有符号类型,则会发生两件事之一. 如果char
是无符号类型,则没有输入匹配 EOF。也不是正确的行为。)
修复它很容易,但您的代码不会检测到 EOF。始终处理 EOF;数据可能格式错误。这是代码中的一个简单修复。
第三个问题是printf()
语句不以换行符结尾。它应该。
您在这里的测试条件很奇怪:
if (wordChar[--index] == 'e')
{
combinationTimes++;
++index;
}
使用一个前增量和一个后增量很奇怪,但这只是一个一致性问题。但是,更糟糕的是,当字符i
出现在输入中并且前面没有. 时会发生什么e
。考虑这一行@include <stdio.h>
:你从index
1 开始;那是 a i
,所以你减少索引,但wordChar[0]
不是 a e
,所以你不要再增加它,但是循环结束了,所以循环index
再次检查 1 ,并继续循环测试i
isi
和好久@
没有了。e
没有理由先递减然后递增index
;只需使用:
if (wordChar[index-1] == 'e')
combinationTimes++;
修复这些后,您的代码就会正常运行。您的麻烦主要在于您使用的数组不够大(大小为 0),并且您正在用正在读取的数据覆盖准随机内存。
#include <stdio.h>
int main(void)
{
int index = 0;
int combinationTimes = 0;
int total = 0;
int userInput;
char wordChar[4096];
printf("please enter your input:\n");
while ((userInput = getchar()) != '#' && userInput != EOF)
{
if (userInput == '\n')
continue;
wordChar[index] = userInput;
index++;
total++;
}
printf("total: %d\n", total);
for (index = 1; index < total; index++)
{
if (wordChar[index] == 'i')
{
if (wordChar[index-1] == 'e')
combinationTimes++;
}
}
printf("number of combination is: %d\n", combinationTimes);
return 0;
}
请注意,您可以合理地将嵌套编写if
为:
if (wordChar[index] == 'i' && wordChar[index-1] == 'e')
combinationTimes++;