囹木 2022-11-29 23:37 采纳率: 100%
浏览 8
已结题

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

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

img

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

img

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


#include<stdio.h>
#include<ctype.h>
#include<string.h>

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///
    } 
}
  • 写回答

2条回答 默认 最新

  • 叶落花枯 2022-11-30 00:33
    关注

    两个地方的问题。如下

    
                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;
                    }
                }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 创建了问题 11月29日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址