Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找字长统计信息的程序_C - Fatal编程技术网

C 查找字长统计信息的程序

C 查找字长统计信息的程序,c,C,我被期望制作一个程序来计算和显示文本文件中单词长度的统计信息。我已收到以下文件 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);

我被期望制作一个程序来计算和显示文本文件中单词长度的统计信息。我已收到以下文件

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

诸如此类……

作为一名新撰稿人,我会让你休息一下,试着回答你没有问过的问题

我相信问题是“如何进行”。这将是一个很长的回答,因为我会尽量详细说明,因为你似乎是个新手。希望这能帮助你或者其他人

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

第一件事:你发布的代码中似乎有一个输入错误。在提供的源代码中,如果找不到文件,则问题在于
return1
语句。这应该是
return-1
,因为如果测试文件正好有一个字母,会发生什么?代码不能正常工作

现在,首先要转换给出的单词问题:需要有一个单词计数数组来跟踪1个字母、2个字母等单词。根据英语词典,现在最长的单词是45个字母。因此,从理论上讲,您需要一个包含45个
字数元素的数组。您可以根据需要缩短此长度

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

在该
while
中,您需要另一个
while
。这个while需要一次计算
字长
一个字符,直到看到
str的空白字符或尾随的“/0”字符。为此,在第二个while之前将wordLength初始化为零。然后,为您计算的每个字符的字长添加1,并增加
下标

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

最后,您需要打印出wordCounts数组值。因为大多数单词长度的值都是零,所以我不会打印这些。除非将wordCounts数组的最大长度设置为10,而不是45。您需要一个
for
循环遍历wordCounts数组,并执行如下操作:
printf(“%2d字母单词=%d”,…,…)。请记住,您的单字母单词将位于元素0中

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

这是我在编写解决方案后提出的伪代码。它比普通伪代码要详细一点。(就我个人而言,我缩写了所有变量名并使用Pascal大小写,但这只是我自己。)

声明
字数
下标
的数字数组

对于
字数的每个元素,将字数归零,否则代码将无法正常工作

将下标重新初始化为零

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

字长
初始化为零

只要
str[subscript]
不是空字符或空字符,就在字长中添加1

增加下标

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

你的任务完成了


现在,我可以发布可以用来产生这个伪代码的实际代码,但是如果你自己提出它会更好。如果您尝试但代码中有一个bug,请发布一个新问题,我将尝试返回以回答它。希望这能帮助你或其他人。

不清楚你在问什么。请编辑问题,并显示文件内容的示例,以及您希望输出的内容。您面临的实际问题是什么(编译器错误、意外输出等)?我想象textStr是作为参数传递给该函数的?如果是这样,它就是一个指针,您不必返回字符串。函数终止后,调用方应该在本地拥有数组,您可以访问数组的内容。一个错误:
ch
需要是int,而不是char:您的计划是什么?你试过什么?你打算如何记录每个单词的长度?你打算如何计算每种长度的字数?你真的需要向我们展示你所做的尝试以及你遇到的问题。从第一个版本的
main()
开始,您已经做了一个合理的开始。现在需要编写代码的下一部分,先扫描
readFile()
返回的字符串。