我应该做一个程序来计算和显示有关文本文件中单词长度的统计信息。提供了以下文件
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
以此类推...
答案 0 :(得分:1)
作为新的贡献者,我将休息一下,尝试回答您未曾提出的问题。 ;)
我相信问题是“如何进行”。这将是一个长答案,因为您似乎是新手,所以我会尽力详细介绍。希望这会对您或其他人有所帮助。
诀窍是解决一个单词问题并将其转换为数学解决方案。最好的方法是编写“伪代码”。 (如果需要,请参见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大小写,但这仅是我。)
声明一个wordCounts
和一个subscript
的数字数组。
For
wordCounts的每个元素,将单词数清零,否则代码将无法正常工作。
将subscript
初始化为零。
只要(while
下标小于len
,就继续。
将wordLength
初始化为零。
只要str[subscript]
不是空白或空字符,请在单词长度上加1。
增加下标。
两个while
语句完成后,如上所述打印出wordLengths数组。
您完成了!
现在,我可以发布可用于编写此伪代码的实际代码,但是如果您自己提出,那会更好。如果您尝试执行但代码中有错误,请发布一个新问题,我将尝试再次进行回答。希望这对您或其他人有帮助。