0

我的任务是:

编写一个程序,读取最多 # 的输入并报告序列 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;
}

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

在书中,他说用“获得你的 eieio 奖”来测试它,它起作用了……但在我玩了一点之后,我发现并不总是这样。

4

2 回答 2

3

似乎没有必要将文件读入数组。您只需要在读取或到达 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 更改为index4096。这对于您的测试目的来说已经足够大了(但实际上程序应该注意数组而不是溢出它 - 但是我认为数组不是必需的完全没有;参见上面的代码)。

下一个主要问题是,尽管它的名字,getchar()返回一个int,而不是一个char。它可以返回任何有效字符加上一个不同的值 EOF。所以它必须返回一个大于 a 的值char。(如果您使用char. 如果char是有符号类型,则会发生两件事之一. 如果char是无符号类型,则没有输入匹配 EOF。也不是正确的行为。)

修复它很容易,但您的代码不会检测到 EOF。始终处理 EOF;数据可能格式错误。这是代码中的一个简单修复。

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

您在这里的测试条件很奇怪:

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

使用一个前增量和一个后增量很奇怪,但这只是一个一致性问题。但是,更糟糕的是,当字符i出现在输入中并且前面没有. 时会发生什么e。考虑这一行@include <stdio.h>:你从index1 开始;那是 a i,所以你减少索引,但wordChar[0]不是 a e,所以你不要再增加它,但是循环结束了,所以循环index再次检查 1 ,并继续循环测试iisi和好久@没有了。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++;
于 2013-01-29T05:10:25.483 回答
0

更改您的wordChar数组值。

int main(void)

{
    int index = 0;
    int combinationTimes = 0;
    int total = 0;
    char userInput;
    //char wordChar[index]; // index = 0
    char wordChar[255]; // should change the value of array.

    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;
}

或者你可以使用pointer然后使用mallocand realloc

于 2013-01-29T04:00:29.753 回答