字数统计程序 – stdin
对于以下问题 ,
编写一个程序,将英文文本读入数据结尾(类型控制-D表示终端数据结束,见下文检测),并打印字长计数,即长度字总数发生了1次,长度为2次,依此类推。
将单词定义为字母字符序列。 您应该允许最多25个字母的单词长度。
典型输出应该是这样的:
length 1 : 10 occurrences length 2 : 19 occurrences length 3 : 127 occurrences length 4 : 0 occurrences length 5 : 18 occurrences ....
要读取数据结尾的字符,请参阅上述问题。
这是我的工作解决方案,
#include int main(void){ char ch; short wordCount[20] = {0}; int count = 0; while(ch = getchar(), ch >= 0){ if(ch == ' ' || ch == ',' || ch == ';'|| ch == ':'|| ch == '.'|| ch == '/'){ wordCount[count]++; count=0; }else{ count++; } } wordCount[count]++; // Incrementing here looks weird to me for(short i=1; i< sizeof(wordCount)/sizeof(short); i++){ printf("\nlength %d : %d occurences",i, wordCount[i]); } }
题:
1)
从代码优雅方面来看,我可以避免while
循环外增加(++) wordCount
吗?
2)
我可以根据字大小使wordCount
数组大小更加动态,而不是常量大小20
吗?
注意:了解struct
但尚未学习像Linkedlist
这样的动态结构
对于动态分配,您可以从空格开始20个shorts
(尽管问题陈述似乎要求您允许最多25个字符的单词):
short maxWord = 20; short *wordCount = malloc(sizeof(*wordCount) * maxWord);
然后,当您递增count
时,如果当前单词的长度超过动态数组中的计数,则可以分配更多空间:
} else { count++; if (count >= maxWord) { maxWord++; wordCount = realloc(sizeof(*wordCount) * maxWord); } }
完成后别忘了free(wordCount)
。
由于您不需要计算零长度的单词,因此您可以考虑修改代码,以便wordCount[0]
存储长度为1的单词数,依此类推。
1):可以从一个分隔字符扫描到下一个字符,直到你增加wordCount
。 使EOF
成为分界字符。
要2)你可以扫描文件两次,然后决定你需要多少内存。 或者,只要需要更多内存,就会动态重新realloc
。 这是std::array
类在内部执行的操作。
你也应该考虑如果有两个会发生什么 人物一个接一个。 现在你将这算作一个词。