C语言:将文件中所得到的单词表保存到一个顺序表中--使用动态分配数组。

在很多时候我们想要在程序中存储想要的信息,但是又不知道该信息的大小或者说不知道需要多长的数组来存放。动态分配空间这个很好的解决了这个问题,动态分配不仅只可以用在链表中分配节点空间,其实更多时候用来分配数组的空间。今天我记录的这个代码就是一次性分配好信息所需要的空间大小。

假设: 现在我有一个txt文件存放着非常多得单词,我想要把这些文本中的单词存放进我的顺序表中。假设现在想不出很好的方法,只想到用一个二维字符数组来存放这些单词。(当然方法很多不仅限于我这个)

首先我们需要明确几个前提工作:

第一:我们需要知道文件中这些单词有几个 ,目的是为了后面申请存放多少个单词空间做准备      (这里有一个我之前写过的包含很多对文件内容的操作,里面就包含了计算单词个数的多少***************就是比较粗糙,没做什么解释***如何删除超链接和统计单词数等操作************************,你也可以等下直接看我后面放的代码。)

第二:因为我们用的是二维数组,需要保证所有单词都有足够空间存下该单词长度 。(这时候就用上了之前我在博客里面写到的函数功能,里面写的比较详细这里就不展开了如何在文件中找到最长的单词 )知道长度后就是为后面申请空间做准备,因为知道了最长的那个单词长度了,只要保证能装得下最长的单词,其他的也就自然装得下。

 第三:准备工作完成后就到了我们的目的了,把文件中的单词存放进刚刚申请出来的空间里面。

下面是代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>//该头文件包含isalpha()这个函数
 
int F_link_len,F_maxword_len;

/*顺序表*/

typedef struct _Elem{
	char *word;//存放单词 
}Elem; 

typedef struct _Elemlink{
	Elem *array;//动态定义数组
	int link_len;//数组长度  
}Elemlink;
char temp[50];
//辅助功能,用来临时存放最长的单词,因为在函数内部定义想要返回数组就会造成内存泄漏 

Elemlink *Sqlink_Firefox = NULL;
int count_to_words(FILE *fp);
char *Find_MAXword(FILE*fp);
void saveword_to_Sq(Elemlink *Sqlink, FILE *fp1);

int main(void)
{
        int i;
		FILE *fp1 = NULL;
		FILE *fp2 = NULL;
		char ch; 
		Sqlink_Firefox = (Elemlink*)malloc(sizeof(Elemlink));//建立一个顺序表的空间 ,地址是全局变量,出了函数后也不会被释放 
		fp1 = fopen("D:/单词文件.txt","r");
		F_link_len = count_to_words(fp1);//统计单词表 接收单词数量
		Sqlink_Firefox->array = (Elem*)malloc(sizeof(Elem)*F_link_len);//分配顺序单词表空间 
		fclose(fp1);
		
		fp1 = fopen("D:/单词文件.txt","r");
		F_maxword_len = sizeof(Find_MAXword(fp1)) + 1;//找到单词表中最长单词的长度 ,加一方便后面分配空间时需要把\0填进去 
		fclose(fp1);
			
		for(i = 0; i < F_link_len; i++)
		{
			Sqlink_Firefox->array[i].word = (char*)malloc(sizeof(char)*F_maxword_len+1);
			//分配每个单词的空间,用最大长度的单词空间就能存下所有的 
		}
		fp1 = fopen("D:/单词文件.txt","r");
		saveword_to_Sq(Sqlink_Firefox, fp1); 
		fclose(fp1);


        printf("打印存放进顺序表的单词:\n")
        for(i = 0; i < F_link_len; i++)
        {
            printf("%s ", Sqlink_Firefox->array[i]);
        }
    return 0;
}

int count_to_words(FILE *fp)//统计删除后的单词个数 
{
	char ch;
	int nums = 0;
	while(!feof(fp))
	{
		ch = getc(fp);
		if(isalpha(ch))
		{
			nums++;
			while(1)
			{
				ch = getc(fp);
				if(!isalpha(ch)) break;
			}
		}
	}
	return nums;
}


char *Find_MAXword(FILE*fp)
{
	char long_word[50];//存放最长的单词
	char ch;
	int n = 0, len = 0, i;
	while(!feof(fp))
	{
		ch = fgetc(fp);
		if(isalpha(ch))
		{
			long_word[n++] = ch;
		}
		else if(!isalpha(ch))
		{
			long_word[n] = '\0';
			if(len <= n - 1)//判断是否遇到比之前最长的单词还要长 ,通过n来判断 
			{
				len = n;//把比之前最长的那个单词长度替换成现在比他长的
				strcpy(temp, long_word);//存放目前找到的最长单词 
			}
			n = 0;
			for(i = 0; i < 50; i++)//用空格清空存放的字符串,继续存放下一个
			{
				long_word[i] = ' ';
			}
		} 
	 } 
	return temp;
}

void saveword_to_Sq(Elemlink *Sqlink, FILE *fp1)
{
	char ch;
	int index = 0, n = 0, start = -1;
	while(!feof(fp1))
	{
		ch = fgetc(fp1);
		if(isalpha(ch))
		{
			if(isupper(ch))
		{
			ch = tolower(ch);
		 } 
			start = 1;
			Sqlink->array[index].word[n] = ch;
			n++;
		}
		else if(start == 1)
		{
			start = -1;
			Sqlink->array[index].word[n] = '\0';//变成字符串单词 
			index++;
			n = 0;
		}
	}
 } 





posted @ 2022-04-25 00:46  竹等寒  阅读(9)  评论(0编辑  收藏  举报  来源