| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 570 人关注过本帖
标题:一个单词统计题,VC给的反应很奇怪!求解释。
只看楼主 加入收藏
tujing_128
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-11-2
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:3 
一个单词统计题,VC给的反应很奇怪!求解释。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "scanner.h"
#include "scanner.cpp"

#define N 20
#define M 100

typedef char *string;

static bool IsLegalWord(string m);
static string ReadLine(FILE *infile);

main()
{
    FILE *infile;
    char name[N];
    string dang,token;
    int now=0,i;
    int chang,n=1;
    int *shu,*tmpshu;
    string *ci,*tmpci;

    printf("程序将读取一个文件,统计单词出现频率。\n");
    printf("请输入文件名:");
    scanf("%s",name);
    getchar();

    infile=fopen(name,"r");

    shu=(int*)malloc(M*n+1);
    ci=(string*)malloc(M*n+1);
    chang=M*n;

/*    for(i=0;i<M*n+1;i++){
        shu[i]=0;
    }
    */
//数组初始化不进行,程序可以运行,删掉注释符,程序出错。

    while (true){
        dang=ReadLine(infile);
        if (dang==NULL) break;
        InitScanner(dang);

        while (strcmp(token=GetNextToken(),"\0")){
            if (IsLegalWord(token)) {
                if (now==0) {
                    ci[now]=token;
                    shu[now]++;
                    now++;
                }else{
                    for(i=0;i<now;i++){
                        if (!strcmp(token,ci[i])) {
                            shu[i]++;break;
                        }
                    }
                    if (i==now) {
                        ci[now]=token;
                        shu[now]++;
                        now++;
                    }
                }
            }
            if (now>chang){
                n++;
                tmpshu=shu;
                tmpci=ci;
                shu=(int*)malloc(M*n+1);
                ci=(string*)malloc(M*n+1);
                for(i=0;i<chang+1;i++){
                    shu[i]=tmpshu[i];
                    ci[i]=tmpci[i];
                }
                free(tmpshu);
                free(tmpci);
                chang=M*n;
            }
        }        
    }
    for(i=0;i<now;i++){
        printf("%s\t%d\n",ci[i],shu[i]);
    }
}

static string ReadLine(FILE *infile)
{
    char s[10000],*b;
    int i=0;
    b=fgets(s,10000,infile);//经检验,数组动态初始化后,本句无法运行,这两者有什么关系吗?
    if (b==NULL) return (NULL);//程序在VC++6.0环境下调试的
    while (s[i++]!='\0') ;
    b=(char*)malloc(sizeof(char)*i);
    strcpy(b,s);
    return (b);
}
        
static bool IsLegalWord(string m)
{
    int n=0,i;
    while (m[n]!='\0') n++;
    for(i=0;i<n;i++){
        if(!isalpha(m[i])) return (false);
    }
    return (true);
}
搜索更多相关主题的帖子: 统计 
2011-01-22 21:09
aaronhexin
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:199
注 册:2010-12-6
收藏
得分:20 
shu=(int*)malloc(M*n+1);
我觉得这句有点问题
我没办法调试你的代码
你改成  shu = (int*)malloc((M*n+1) * sizeof(int));看看
2011-01-22 22:21
tujing_128
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2010-11-2
收藏
得分:0 
谢谢了,就是这里,忘记乘sizeof(int)了,初始化过头了,盖掉了程序本身的代码。
thank you!
2011-01-23 12:57
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
谢谢了,就

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-01-23 19:03
快速回复:一个单词统计题,VC给的反应很奇怪!求解释。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022014 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved