字数统计程序 – 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类在内部执行的操作。

你也应该考虑如果有两个会发生什么 人物一个接一个。 现在你将这算作一个词。