`
vtrtbb
  • 浏览: 358376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《征服C指针》编程例子word_count

阅读更多

复习了C语言,看了《征服C指针》编程上一个例子word_count 试了下,但稍微有点小问题

 

main.c 主程序

 

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

#include "get_word.h"
#include "word_initialize.c"
#include "add_word.c"
#include "dump_word.c"
#include "word_finalize.c"

#define BUF_SIZE 1024

/*这个程序将输出文件的每个单词的频率,该文件名将从用户输入读取
*/

int main()
{
    char file_input[BUF_SIZE],file_output[BUF_SIZE],buf[BUF_SIZE];
    int word_len;
    FILE *fp_in,*fp_out;

    printf("请输入一个被统计的文件的文件名(包括文件后缀),stdin表示从命令行读入:");
    scanf("%s",file_input);
    printf("请输入统计数据的输出文件的文件名(包括文件后缀),stdout表示从命令行输出:");
    scanf("%s",file_output);

    /*处理输入的文件名*/

    if(!strcmp(file_input,"stdin")) //strcmp函数在两个字符串相同时返回0
    {
        fp_in = stdin;
    }
    else
    {
        if((fp_in=fopen(file_input,"r"))==NULL)
        {
            printf("open input file error!\n");
            exit(1);
        }
    }
    /*处理输出文件名*/
    if(!strcmp(file_output,"stdout"))
    {
        fp_out = stdout;
    }
    else
    {
        fp_out = fopen(file_output,"w");
    }    
     /*初始化单词管理数据库*/
    word_initialize();

    /*读取单词并加入单词管理数据库*/
    while((word_len=get_word(buf,BUF_SIZE,fp_in)) != EOF)
    {
        if(word_len!=0)
        {
            add_word(buf);
        }
    }
    /*输出单词出现的频率*/
    dump_word(fp_out);
    word_finalize();
}

 

word_manage.h

 

#ifndef WORD_MANAGE_H
#define WORD_MANAGE_H
#include <stdio.h>

typedef struct word_tag
{
    char *word;
    int count;  //单词数目
    struct word_tag *next_word;
}WORD;

extern WORD *word_head;

void word_initialize(void);

void add_word(char *word);

void dump_word(FILE *fp);

void word_finalize(void);

#endif

 

word_initialize.c

#include "word_manage.h"

WORD  *word_head = NULL;    //这个变量将在word_manage.h中被引用
void word_initialize(void)
{
    word_head=NULL;
}

 

add_word.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "word_manage.h"

/*创建一个新的结点*/

static WORD *create_word(char *word) {
    char *temp;
    WORD *new_word;
    new_word=malloc(sizeof(WORD));
    temp=strdup(word);      //char *strdup(const char *str)用于返回str字符串的副本,这个副本和str具有不同的内存地址空间
    new_word->word=temp;    //此处不可以直接将word的指针地址赋给新建的单词
    new_word->count=1;
    new_word->next_word=NULL;
    return new_word;
}
void add_word(char *word)
{
    WORD *pos,*pre,*new_word; //pos指向当前结构体,pre指向当前结构体的上一个结构体
    pos=word_head;
    pre=NULL;
    int result;

    /*如果不是第一个,则循环直到找到插入点或同样的单词*/

    while(pos!=NULL)
    {
        if((result=strcmp(pos->word,word))<0)
        {
            pre=pos;
            pos=pos->next_word;
        }
        else break;
    }
    /*找到同样的单词*/
    if(word_head != NULL && result ==0 )
    {
        pos->count++;
    }
    else
    {
        /*插入到第一个单词结点*/

        if(pre==NULL)
        {
            new_word = create_word(word);
            new_word->next_word=word_head;
            word_head=new_word;
        }
        /*插入到其他点*/

        else
        {
            new_word=create_word(word);
            new_word->next_word=pos;
            pre->next_word=new_word;
        }
    }
}

 

dump_word.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "word_manage.h"

void dump_word(FILE *fp)
{
	WORD *pos;	
	for(pos = word_head;pos;pos = pos->next_word) {
		fprintf(fp,"%-20s%5d\n",pos->word,pos->count);		
	}	
}

  word_finalize.c

#include <stdlib.h>
#include "word_manage.h"
void word_finalize(void)
{
    WORD *temp;

    temp=word_head;

    while(temp!=NULL)

    {

        word_head=word_head->next_word;

        free(temp->word);

        free(temp);

        temp=word_head;

    }

}

  get_word.c

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

/*

这个函数从输入文件fp获取单词,参数buf指向获取的单词,返回值返回单词长度或是EOF提示

*/

int get_word(char *buf,int buf_size,FILE *fp)
{
    int ch,len;
    len=0;
    while((ch=getc(fp))!=EOF&&isalnum(ch))  //isalnum(int c)函数在c是数字或字母时返回ture
    {
        buf[len]=ch;      //buf[len] is a syntax sugar of *(buf+len)   
        if(len>=buf_size)
        {
            printf("Error:word too long!");     //单词长度大于buf_size时发出警报并退出程序
            exit(1);
        }
        len++;
    }
    buf[len]='\0';  //给字符串添加结束标志
    if(ch==EOF)
    {
        return EOF;
    }
    else
    {
        return len;
    }

}
/*get_word.h*/
#ifndef GET_WORD_H
#define GET_WORD_H
/*这个函数用于读取fp所指向文件的单词,读取成功则返回单词长度,到达文件尾部返回EOF*/
int get_word(char *buf,int buf_size,FILE *fp);
#endif

 

问题: 1、在main.c 文件中,看例子只 include  get_word.h 和 word_manage.h 两个文件,而我这必须要把所有的 文件要include 进来才能执行

              2、读取文件时并不在第一行读取,而是从第二行读取了。

分享到:
评论

相关推荐

    一份不错的C语言指针教程.rar_c语言指针

    10. **实践应用**:提供实际的编程例子和练习,让读者通过实践加深对指针的理解。 通过这个教程,学习者不仅可以掌握C语言指针的基本用法,还能了解到指针在高级编程技巧和复杂数据结构中的应用。理解并熟练运用...

    C语言精彩编程百例_源代码

    《C语言精彩编程百例_源代码》是一个包含大量C语言编程实例的资源包,旨在帮助初学者和希望提升技能的程序员深入理解C语言的基本概念和应用。通过这些实例,学习者可以直观地看到理论知识如何转化为实际的代码,从而...

    C语言高级教程-上海贝尔_C语言_编程规范c++_编程_

    《C语言高级教程-上海贝尔》是一本深入探讨C语言编程技术与规范的教程,特别强调了在实际开发中遵循的编程标准。本教程源于上海贝尔公司的内部编程规范,旨在帮助程序员提高代码质量和可维护性,是C语言学习者进阶的...

    指向函数的指针的用法.rar_c 指针_c语言指针_指针

    - C语言的`qsort()`函数就是一个很好的例子,它接受一个比较函数指针作为参数,用于排序数组。 8. **注意事项** - 不同类型的函数不能赋值给同一个函数指针,因为它们的地址不同。 - 避免空悬指针,确保函数指针...

    C语言编程宝典之一.rar_C语言_C语言编程宝典_c语言编程_visual c

    《C语言编程宝典之一》是一本专注于C语言学习的资源集合,旨在帮助读者深入理解和掌握C语言的基础和高级概念。C语言是一种强大的、低级的编程语言,被广泛应用于系统编程、软件开发、游戏引擎等多个领域。这本书或...

    C语言低级编程知识库_C_下载.zip

    C语言是一种强大的、底层的编程语言,被广泛用于系统编程、嵌入式开发以及各种软件的基础构建。在“C语言低级编程知识库”中,我们可以深入探讨C语言的精髓,学习如何利用它来直接操控硬件资源,实现高效且灵活的...

    C语言编程_C语言_c#读写文件_

    本篇文章将详细讲解C语言编程中的核心知识点,以及如何使用C语言进行文件读写和指针操作,这些是C语言程序设计中的关键技能。 首先,我们来探讨C语言编程的基本概念。C语言以其简洁、高效著称,它的语法结构清晰,...

    C语言学习例子_C语言_oceanqnm_

    在"函数指针.c"中,你将学习如何声明、定义和使用函数指针,以及如何用它们来实现回调机制或者策略模式等高级编程技巧。 3. **条件判断**:"判断是否为闰年.c"文件展示了如何使用条件语句(如if-else)来判断一个...

    C语言复习资料--编程.zip_C语言_C语言资料_复习_编程_编程复习资料

    C语言是一种广泛应用于系统开发、软件工程和嵌入式系统的高级编程语言,因其高效、灵活和简洁而备受程序员喜爱。这份“C语言复习资料--编程.zip”压缩包包含了一本名为“C语言复习资料--编程.doc”的文档,显然是...

    c_learn_20131019_C语言_编程集锦_learnc_

    本文将深入探讨"C_learn_20131019_C语言_编程集锦_learnc_"这个资源包中的知识要点,帮助初学者们掌握C语言的基础并提升编程技能。 一、C语言基础 C语言是结构化编程语言的典范,它的语法简洁明了,易于理解和学习...

    C_exaple.rar_C语言高级编程_c 语言 高级 进阶_c语言 例子

    描述中提到,通过这些例子,我们可以提升C语言编程的能力,这意味着文件中的内容可能包括解决特定问题或实现特定功能的代码示例。 现在,我们详细讨论C语言高级编程的一些核心知识点: 1. **指针操作**:C语言的...

    C语言的精彩编程百例.rar_C语言_C语言精彩百例_c语言 例子_site:www.pudn.com_编程

    C语言是一种强大的、通用的编程语言,被广泛用于系统编程、应用编程、嵌入式系统以及游戏开发等领域。"C语言的精彩编程百例.rar" 是一个针对C语言编程的学习资源,它包含了丰富的实例,旨在帮助学习者深入理解和熟练...

    C语言学习例子3_swepti42_C语言_

    "C语言学习例子3_swepti42_C语言_"这个资源包显然旨在帮助初学者或者有经验的程序员深入理解C语言的核心概念。以下是基于这个压缩包中的文件所涵盖的知识点的详细解释: 1. **不同距离货车运费不同.c**:这个文件...

    C语言经典例题100道.zip_C语言_c语言例子_c语言例题_slowly1l4_经典例题

    C语言是一种强大的、通用的编程语言,被广泛用于系统编程、应用编程、嵌入式系统以及游戏开发等领域。它的简洁性和高效性使得它成为初学者和专业人士的首选语言之一。"C语言经典例题100道.zip" 是一个专门为学习...

    C语言学习例子1_C语言_

    标题"‘C语言学习例子1’"和描述"‘这是编写的C语言的一些基础算例,可以借鉴学习’"暗示了我们将探讨一些C语言的基础编程技巧。下面,我们将通过分析压缩包中的三个文件名——"二分法.c"、"数组倒序输出.c"和"比较...

    C语言程序案例分析编程题_C语言_roughg5w_

    在本资源中,"C语言程序案例分析编程题_C语言_roughg5w_" 主题主要针对初学者,旨在帮助他们更好地理解和掌握C语言。C语言是一种基础且强大的编程语言,广泛应用于系统开发、嵌入式系统、软件工程等多个领域。通过...

    C语言学习例子4_C语言_

    在C语言的学习过程中,实践是...通过分析和运行这些代码,学习者可以加深对C语言的理解,提升编程能力。同时,这些基础知识也是进一步学习更复杂算法和数据结构的基础。在实践中不断探索和实验,是掌握C语言的关键。

    C语言学习例子2_C语言_

    通过实践这些例子,你可以更深入地理解和运用C语言的基本概念,从而提升编程技能。在实际编程中,一定要注意内存管理,避免未初始化的变量,理解指针的使用,以及正确地处理函数调用和参数传递。

Global site tag (gtag.js) - Google Analytics