gpt4 book ai didi

c - 从输入中检测字符组合

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:06 27 4
gpt4 key购买 nike

我的任务是:

编写一个程序,读取最多为 # 的输入并报告序列 ei 出现的次数。

我写了一些在大多数时候都有效的东西,但是当它发送时会有输入...

像这样输入:(假设返回1)

sdlksldksdlskd
sdlsklsdks
sldklsdkeisldksdlk
#
number of combination is: 0

这是代码:

int main(void)

{
int index = 0;
int combinationTimes = 0;
int total = 0;
char userInput;
char wordChar[index];

printf("please enter your input:\n");

while ((userInput = getchar()) != '#')
{
if (userInput == '\n')
continue;

wordChar[index] = userInput;
index++;
total++;
}

for (index = 1; index < total; index++)
{
if (wordChar[index] == 'i')
{
if (wordChar[--index] == 'e')
{
combinationTimes++;
++index;
}
}
}

printf("number of combination is: %d", combinationTimes);

return 0;
}

你能告诉我使用这个输入我没有得到什么吗?

在书中他说用“接受你的 eieio 奖”来测试它并且它有效......但是在我玩了一会儿之后我发现并非总是如此。

最佳答案

把文件读入数组好像真的没必要。你只需要记录多少次ei在您阅读 # 之前找到或到达 EOF:

#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行,第二个停在 #在比较中,第三个读取整个文件。它还为示例数据提供了正确的输出。


分析代码

您的主要问题是您没有为数组分配任何空间。从 index 更改数组的维度到,比如说,4096。这对于你的测试目的来说已经足够大了(但实际上程序应该注意数组而不是溢出它 - 但我认为数组根本不是必需的;见上面的代码).

下一个主要问题是尽管它的名字是getchar()返回 int , 不是 char .它可以返回任何有效字符加上一个不同的值 EOF。所以它必须返回一个大于 char 的值. (如果使用 char 会发生两种情况之一。如果 char 是有符号类型,一些有效字符——通常是 ÿ、y-umlaut、U+00FF、带分音符的拉丁文小写字母 Y——也被视为 EOF,甚至尽管它只是一个字符。如果 char 是无符号类型,则没有输入匹配 EOF。这也不是正确的行为。)

解决这个问题很容易,但是您的代码没有检测到 EOF。始终处理 EOF;数据可能格式不正确。这是代码中的一个简单修复。

第三个问题是 printf()语句不以换行结束;它应该。

这里的测试条件很奇怪:

        if (wordChar[--index] == 'e')
{
combinationTimes++;
++index;
}

使用一个前增量和一个后增量很奇怪,但这只是一个一致性问题。更糟糕的是,当字符 i 出现时会发生什么?出现在输入中并且前面没有 e .考虑 @include <stdio.h> 行: 你从 index 开始作为 1;那是一个i ,所以你递减索引,但是 wordChar[0]不是 e ,所以你不会再递增它,但循环的结尾会递增,所以循环检查 index 1,并继续循环测试 ii@不是 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++;

关于c - 从输入中检测字符组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575082/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com