C语言用结构体统计文件中字符串出现次数

读入一个记录有学生名字的txt文件,然后声明一个结构体用于储存学生名字和名字出现次数,然后声明一个指向结构体的指针数组,用于储存单个名字和出现次数。用一个puffer来接收名字。在读取名字的时候,测试该名字是否已经在指针数组中存在,如果存在,则出现次数加一,如果不存在,也就是说是新名字的话,则使用malloc在堆栈增加一个位置,从接收puffer中复制这个名字到数组中去,出现次数记1。
统计出现次数时应该按降序排列,使用qsort函数。
屏幕输出应为:
请输入要查询的名字:小明
小明 的名字排在第 X 位,出现了 X 次。

请大家给点思路吧,看了下书,但对结构体的使用实在不够熟悉,不知道如何下手。读取的话应该使用fgets还是fscanf? 应该一次过读完再统计吗?
说错了,文件内容不是汉字,就英文名字可以了

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

struct name_count
{
char name[64];
int count;
};
typedef struct name_count **PTArray;

int comp(const void *p1,const void *p2)
{
struct name_count *pnc1=*((struct name_count**)p1);
struct name_count *pnc2=*((struct name_count**)p2);

//printf("p1:%s %d\tp2:%s %d\n",(*pnc1).name,(*pnc1).count,(*pnc2).name,(*pnc2).count);
if((*pnc2).count<(*pnc1).count)
return -1;
return ((*pnc2).count>(*pnc1).count);
}

int main()
{
//将f指定为记录有学生名字的txt文件的文件路径名
//学生名字之间以空格分隔
const char f[]="t.txt";
char pbuffer[128];
int i,len=0,capacity=16;
FILE *inf;
PTArray ptarrtemp,ptarr=(PTArray)malloc(sizeof(struct name_count*)*capacity);
for(i=0;i<capacity;i++)
ptarr[i]=(struct name_count*)malloc(sizeof(struct name_count));
inf=fopen(f,"r");
while(!feof(inf))
{
if(EOF!=fscanf(inf,"%s",pbuffer))
{
//puts(pbuffer);
if(len==capacity)
{
capacity+=16;
ptarrtemp=(PTArray)malloc(sizeof(struct name_count*)*capacity);
memcpy(ptarrtemp,ptarr,sizeof(struct name_count*)*len);
free(ptarr);
ptarr=ptarrtemp;
}
for(i=0;i<len;i++)
{
if(!strcmp((*ptarr[i]).name,pbuffer))
{
(*ptarr[i]).count++;
break;
}
}
if(i>=len)
{
ptarr[len]=(struct name_count*)malloc(sizeof(struct name_count));
strcpy((*ptarr[len]).name,pbuffer);
(*ptarr[len]).count=1;
len++;
}
}
}
qsort(ptarr,len,sizeof(struct name_count*),comp);
printf("名字\t出现次数\n");
for(i=0;i<len;i++)
printf("%s\t%d\n",(*ptarr[i]).name,(*ptarr[i]).count);
printf("请输入要查询的名字:");
gets(pbuffer);
for(i=0;i<len;i++)
{
if(!strcmp((*ptarr[i]).name,pbuffer))
{
printf("%s的名字排在第%d位,出现了%d次。",pbuffer,i+1,(*ptarr[i]).count);
break;
}
}
if(i>=len)
printf("没有这个名字!\n");
for(i=0;i<len;i++)
{
free(ptarr[i]);
}
free(ptarr);
fclose(inf);
return 0;
}追问

请问能稍微加点注释吗?或者pnc1和pnc2指什么?capacity为什么取16?另外txt文件的名字格式是一个名字一行的。

温馨提示:内容为网友见解,仅供参考
无其他回答

c语言统计字符串中每个字符出现的次数
char*ptr2=src+strlen(src),*prev=NULL;\/\/ptr2为src的末位置指针 int len=strlen(s),n=0;\/\/子串的长度和计数器 for(;*ptr;ptr++)\/\/循环整个串 { if(ptr2-ptr<len)\/\/如果一开始子串就大于src,则退出 break;for(prev=ptr;*prev==*p;prev++,p++)\/\/寻找第一个相等的位置,然后从此位置...

...一个字符,统计该字符在字符串中出现的次数。写出程序,加急
{char s[99],c;int i=0,n=0;printf("输入字符串(按Enter结束):\\n");gets(s);printf("输入字符(按Enter结束):");c=getchar();for(i=0;i<99;i++){if(c==s[i])n++;} printf("字符串%s中字符%c出现%d次",s,c,n);} \/\/看时间,你是用不到了,留个要学习的看吧。(字...

...统计该文章中每个单词的出现次数,并输出出现次数最多的前5个单词...
include <string.h> \/\/能统计的最大单词个数,可以自己改 define MAX_WORD_COUNT 500 \/\/结构体,保存每个单词及对应的个数 typedef struct WordCount { char cWord[20];int iCount;}T_WordCount;int CalcEachWord(const char *pText);\/\/计算单词个数及输出信息等 void LowerText(char *pText)...

C语言如何统计并输出不同字符在文章中出现的次数或频率(空格、换行...
else if('0'<=i&&i<='9') \/**如果是0--9之间的数字,则执行下面的number++**\/ number++;else if(i==' ') \/**这个是判断空格的**\/ space++;else qita++; \/**这个是统计其他未知字符个数**\/ } printf("english=%d,space=%d,number=%d,qita=%d",english,space,number,qi...

C语言统计一篇文件里出现最多的三个单词
\/\/统计单词出现频率 include <stdio.h> include <stdlib.h> include <string.h> struct Node{ int c; \/\/单词w程序次数 char w[20]; \/\/单词 struct Node *next;struct Node *pre;};char s[]=" ,;.?!:(\\"\\\\)['|]{\/}@#$&*+-=<~`_>0123456789\\12"; \/\/单词分隔符 \/\/在head...

C语言 求教,打开一文本,输出每个字母出现的次数,程序源代码见下,看有...
有必要用结构体吗?直接定义一个数组x[26]={0},初始化为零,读入ch后,处理一下ch,如果不区分大小写 区分大小写的话定义两个数组 大写A是41h,小写a是61h,二级制为高4位6是0110 4是0100 这样就是多了一个1在第六位上 那么把他去掉即可 ch&=11011111b ...

请问c语言当中,如何统计数字各自出现的次数
include <stdio.h> int main() { int num = 0, i = 0;printf("请输入一个整数:");scanf("%d", &num);int array[10] = {};while(num) { array[num % 10]++; \/\/让数组下标代表所判断的数字 num \/= 10;} for (i = 0; i < 10; i++) { if (array[i] != 0)print...

C语言 计算一篇英文文章中出现次数最多的前5个单词,按英文字典顺序输出...
if (!bFound&&strlen(szWord)>0)\/\/如果没相配,把字符存在g_WordFound里 { strcpy(g_WordFound[g_nMatch].szWord,szWord);g_WordFound[g_nMatch].nCount++;g_nMatch++;} tmp=endChr;if (tmp>=end) break;} } \/\/此处打印结果 for (i=0;i<g_nMatch;i++){ printf("%s = %d\\...

C语言 统计相同单词出现次数
{ char word[20];int count;}WordCounter;WordCounter wc[MAX];int num=0;main(){ char wd[20];int i;char ch;while(1){ scanf("%s",wd);for(i=0;i<num;i++)if(strcmp(wd,wc[i].word)==0){ wc[i].count++;break;} if(i==num){ num++;strcpy(wc[num-1].word,wd);w...

C语言编程题目 给一个字符串,请找出出现次数最多的大写英文字母。_百 ...
void main(){ chara[100];intfre[26];int i,len,big=0;gets(a);for(i=0;i<26;i++)fre[i]=0;len=strlen(a);for(i=0;i<len;i++)if(a[i]>='a'&&a[i]<='z')fre[a[i]-'a']++;for(i=0;i<len;i++)if(...

相似回答