囹木 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 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?