Closed. This question needs to be more focused。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
                        
                        5天前关闭。
                                                                                            
                
        
我应该做一个程序来计算和显示有关文本文件中单词长度的统计信息。提供了以下文件

int readFile(const char fName[], char textStr[]){
    FILE *fPtr;
    char ch;
    int size = 0;

    if ((fPtr = fopen(fName, "r")) == NULL) {
        fprintf(stderr, "Error, failed to open %s: ", fName);
        perror("");
        return 1;
    }

    while ((ch = fgetc(fPtr)) != EOF) {
        if (size >= MAX_FILE - 1)
            break;
        textStr[size++] = ch;
    }

    textStr[size] = '\0';

    return size;
}


我可以使用以下代码验证是否可以访问文件

int main() {
    char str[MAX_FILE];
    int len = readFile("test.txt", str);
    if (len == -1) {
        printf("An error occurred\n");
    } else {
        printf("file read");
    }
}


文件test.txt包含

The quick brown fox jumps over the lazy dog


我想做的就是获取test.txt的内容,并找到其中每个单词的长度,例如:

1 letter words- 0
2 letter words - 0
3 letter words - 3
4 letter words -4


等等...

最佳答案

作为一个新的贡献者,我将让您休息一下,并尝试回答您未曾提出的问题。 ;)

我相信问题是“如何进行”。这将是一个很长的答案,因为您似乎是个新手,所以我会尽力而为。希望这会对您或其他人有所帮助。

诀窍是解决一个单词问题并将其转换为数学解决方案。最好的方法是编写“伪代码”。 (如果需要,请参阅Wikipedia了解更多信息。)最后我将给您一些伪代码,但是由于这似乎是一项家庭作业,因此请尝试首先编写自己的伪代码。如果您阅读了伪代码,但仍然没有帮助,我可以稍后发布解决方案。 (我不是一个优秀的程序员,所以它可能不是最好的程序。花了很长时间才提出来。)

首先,第一件事:您发布的代码中似乎有一个错字。在提供的源代码中,如果找不到该文件,则问题是return 1语句。应该是return -1,因为如果您的测试文件正好有1个字母,会发生什么情况?该代码将无法正常工作。

现在,首先要转换单词问题,您将获得:您需要一个单词计数数组来跟踪1个字母,2个字母等单词。现在,根据this,英语词典中最长的单词是45个字母。因此,从理论上讲,您需要具有45个wordCounts元素的数组。您可以根据需要缩短此时间。

现在要处理您的str变量,您需要一个while语句一次通过一个字符。由于字符串中的字符从元素0到len变量少一,因此您需要相应地对while进行编码。

在该while中,您需要另一个while。这一次需要一次将wordLength字符累加一次,直到看到空白或str末尾的'/ 0'字符为止。为此,您可以在第二秒之前将wordLength初始化为零。然后为您计数的每个字符在wordLength上加1,并增加subscript

在此内部while的末尾,您需要累积wordCounts。请记住,您的1个字母的单词将被累加到数组的元素0中。因此,您需要调整wordLength - 1数组元素。之后,您需要增加下标,以用来一次通过一个字符来遍历str

最后,您需要打印出wordCounts数组值。由于大多数字长的值为零,因此我不会打印这些字长。除非将wordCounts数组的最大长度设置为10,而不是45,而不是45。您希望for循环通过wordCounts数组,并执行以下操作:printf("%2d letter words = %d", ..., ...);。请记住,您的1个字母的单词将位于元素0中;

这是单词问题的非常详细的版本,它是“计算短语从1个字母的单词到x个字母的单词的单词数”问题的解决方案。

在对解决方案进行编码之后,这是我想出的伪代码。它比普通的伪代码要详细一些。 (就我个人而言,我缩写所有变量名,并使用Pascal大小写,但这就是我。)

声明wordCountssubscript的数字数组。

For wordCounts的每个元素,将单词数清零,否则代码将无法正常工作。

subscript重新初始化为零。

只要(while)下标小于len,则继续。

wordLength初始化为零。

只要str[subscript]不是空白或空字符,请在wordLength上加1。

增加下标。

完成两个while语句后,如上所述,打印出wordLengths数组。

大功告成!

现在,我可以发布可用于编写此伪代码的实际代码,但是如果您自己提出,那会更好。如果您尝试执行但代码中有错误,请发布一个新问题,我将尝试再试一次以回答问题。希望这对您或其他人有帮助。

07-26 08:12