c++统计每个单词出现次数问题,最后打印只显示第一个单词的出现次数

感谢各位指点,代码瑕疵望理解
Win11 dev-5.11
编译无报错,无警告
输入“to be or not to be”,打印出来的结果只显示“to :2”

img

去掉代码里的p[k]=NULL后,运行结果如图

img

各部分代码用意已用注释标出


#include
#include
#include

int main(){
///提取字符串的单词,并将其储存在p数组中///
    char c[1000];
    gets(c);
    char *p[1000];
    int i = 0;
    p[i] = strtok(c," ");
    while(p[i] != NULL){
        i++;///统计所有单词个数///
        p[i] = strtok(NULL," ");
    }
    int count = 1; ///统计单个单词出现次数///
///统计部分的代码///
    for(int j = 0;j < i;j++){
///基本的思路是,将数组里的前一个单词与之后的每一个单词进行比较,相同则count+1,并将相同的这两个单词的偏后者单词替换成NULL///
        for(int k = 1;k < i;k++){
            if(strcmp(p[j],p[k]) == 0){
                count++;
                p[k] = NULL;///测试过将此句去掉,得到的结果里,除了be外,所有单词的出现次数都不正常///
            }
        }
///该如果数组的元素不是null,就将该数组元素对应的单词和count次数打印///
        if(p[j] != NULL ){
            
            printf("%s : %d\n",p[j],count);
        }
        count = 1; ///重置count///
    } 
}

两个地方的问题。如下


            for(int k = j+1; k < i; k++){ //初始 j+1
                if(p[k] && strcmp(p[j],p[k]) == 0){ //增加判断p[k]不为空的条件
                    count++;
                    p[k] = NULL;
                }
            }

其实可以直接用哈希表做