user-0 提问: 求助：文件操作与字符处理（不知道错在哪了）

回复:
user: user-1
content: 大家帮我看看可以吗？？ 下面这个程序 有弊端 但是我不知道怎么改；谢谢大家了！！！ 弊端就是： 标准输入数据: I am a student. -1 = 1 - 2. q=a-m. z = i - w. My school is SCAU. It is a beau- tiful university. t-t-t-t, 123 123. I like it. 标准输出答案:    1|t 4    2|a 3    3|i 3    4|is 2    5|it 2 你的错误输出结果:    1|a 3    2|i 3    3|is 2    4|it 2    5|am 1  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> struct word {     char c[30];     int n; }w[10000]; int main() {     FILE *fp;     fp=fopen("case1.in","r");     char b[30],ch;     int i=0,m=1,j=0,k=0,t=0,h=0;     if(fp==NULL)     return 0;     while((ch=fgetc(fp))!=EOF)     {         //大写转小写         if(ch>='A'&&ch<'Z')         ch=ch+32;         if(ch>='a'&&ch<='z')         {             b[i]=ch;             i++;             h=1;         }         //如果不是字母的话，先判定是不是连字符         else         {             if(ch=='-'&&(ch=fgetc(fp))=='\n')             h=0;             else             {                 if(h==1)                 {                     //已经找到一个完整的单词                     b[i]='\0';                     i=0;                     h=0;                     m=0;                     //在已有的单词中逐个比对                     for(j=0;j<k;j++)                     {                         if(strcmp(b,w[j].c)==0)                         {                             m=1;                             break;                         }                     }                     //找到则单词数加1                     if(m==1)                     w[j].n++;                     //没找到安放新单词                     else                     {                         w[k].n=1;                         strcpy(w[k].c,b);                         k++;                     }                 }             }         }     }     //输出前5个最多的单词     for(i=0;i<k&&i<5;i++)     {         t=0;         while(w[t].n==0)         t++;         for(j=1;j<k;j++)         {             if(w[j].n>w[t].n)             t=j;             else if(w[j].n==w[t].n)             {                 if(strcmp(w[j].c,w[t].c)<0)                 t=j;             }         }         printf("%s %d\n",w[t].c,w[t].n);         //每个单词输出后，单词数就清零，不影响下次的查找         w[t].n=0;     }     fclose(fp);     return 0; }

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h>  struct cun {     char c[20];     int n; }; int main() {     int i=0,j=0,l,m;     FILE *fp;     char a,fun[20],dan[10000][20];     struct cun word[10000],t; 	if((fp=fopen("case1.in","r"))==NULL) exit(0);     while((a=fgetc(fp))!=EOF)     {         if(a>='A'&&a<='Z') a+=32;         if(a>='a'&&a<='z')         {             fun[i]=a;             i++;         }         else         {             if(a=='-')             {                 if((a=fgetc(fp))!='\n')                 {                     fun[i]='\0';                     strcpy(dan[j],fun);                     j++;                     i=0;                     if((a>='A'&&a<='Z')||(a>='a'&&a<='z'))                     {                         if(a>='a'&&a<='z') {fun[i]=a;i++;}                         else {a+=32;fun[i]=a;i++;}                     }                 }                 else continue;             }             else             {                 fun[i]='\0';                 strcpy(dan[j],fun);                 j++;                 i=0;             }         }        if(j>0&&dan[j-1][0]=='\0') j--;     }     if(i!=0)     {         fun[i]='\0';         strcpy(dan[j],fun);         j++;     }     l=j;     strcpy(word[0].c,dan[0]);     for(i=1,m=1;i<l;i++)     {         for(j=0;j<i;j++)         {             if(strcmp(dan[i],dan[j])==0) break;             else continue;         }         if(j==i)         {             strcpy(word[m].c,dan[i]);             m++;         }     }     for(i=0;i<m;i++)     {         for(j=0;j<l;j++)         if(strcmp(word[i].c,dan[j])==0) word[i].n++;     }         for(i=0;i<m;i++)             for(j=0;j<m-i;j++)             {                 if((word[j].n<word[j+1].n)||(word[j].n==word[j+1].n&&strcmp(word[j].c,word[j+1].c)>0))                 {                     t=word[j];                     word[j]=word[j+1];                     word[j+1]=t;                 }             }     if(m<5) for(i=0;i<m;i++)             printf("%s %d\n",word[i].c,word[i].n);     else for(i=0;i<5;i++)             printf("%s %d\n",word[i].c,word[i].n);     fclose(fp);     return 0; } 修改版（测试正确，提交是错误的）

user: user-2
content: 你主函数中的变量 j 都没有初始化就使用了

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-0
content: 要求是：在当前目录中存在文件名为"case1.in"（其中case后为数字1，不是字母l，写错提交后会判错）的文本文件， 其内容为一篇英文文章（以EOF作为结束标志）。现要求读取该文本文件内容，统计文章中每个单词出现的次数， 并输出出现次数最多的前5个单词及其出现次数（按出现次数由多到少的顺序输出，次数相同时按字典顺序输出， 不足5个单词时，按序输出全部单词）。程序中注意如下细节： （1）	空格、标点符号与回车符起到分隔单词的作用。 （2）	文章一行的末尾可能有连字符，出现连字符时，该行最末的字符串与下行最先出现的字符串构一个单词； （3）	名词缩写算一个单词； （4）	数字不算单词； （5）	单词不区分大小写； （6）	输出时单词全使用小写；  #include "stdio.h"  #include "math.h"  #include "string.h"  #include "stdlib.h"   _______________________   main()  {           _______________________  }   输入格式 文件case1.in中一篇英文文章，包含多段文字，单词数不超过10000，每个单词不超过20个字符   输出格式 按题意输出答案   输入样例 （如case1.in内容如下）  I am a student. My school is SCAU. It is a beau- tiful university. I like it.   输出样例 a 2 i 2 is 2 it 2 am 1 （要考虑到I am a student. -1 = 1 - 2. q=a-m. z = i - w. My school is SCAU. It is a beau-  tiful university. t-t-t-t, 123 123. I like it.这种情况）

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <string.h>   #define     MAX_WORD_LEN    32 #define     MAX_WORD_NUM    1024   struct word_info {     char word[MAX_WORD_LEN];     int cnt; };   static FILE *open_file(const char *filename, const char *open_mode) {     FILE *fp = fopen(filename, open_mode);     if (!fp) {         perror("Open file error!");         exit(0);     }      return fp; }  int is_exist(const char *word, struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++) {        if (strcmp(word, word_list[i].word) == 0)            return i;     }      return -1; }  void sort_as_char(struct word_info *word_list, int num) {     struct word_info wd;     int i, j;      for (i = 0; i < num; i++) {         for (j = 0; j < num - 1 - i; j++) {             if (strcmp(word_list[j].word, word_list[j+1].word) > 0) {                 wd = word_list[j];                 word_list[j] = word_list[j+1];                 word_list[j+1] = wd;             }         }     } }  void sort_as_cnt(struct word_info *word_list, int num) {     struct word_info wd;     int i, j;      for (i = 0; i < num; i++) {         for (j = 0; j < num - 1 - i; j++) {             if (word_list[j].cnt <  word_list[j+1].cnt) {                 wd = word_list[j];                 word_list[j] = word_list[j+1];                 word_list[j+1] = wd;             }         }     } }  int read_words_list(FILE *fp, struct word_info *word_list, int total_num) {     char word[MAX_WORD_LEN] = {0};     int ch, idx;     int i = 0, num = 0, flag = 0;      while ((ch =fgetc(fp)) != EOF) {         if (isalpha(ch)) {             word[i++] = tolower(ch);             if (i == MAX_WORD_LEN) {    /* a word's length is greater than 12. */                 word[i-1] = 0;             }         } else if (ch == ' ' || ch == '\n'                   || ch == '.' || ch == ','                   || ch == '!' || ch == '?') {             if (flag) {                 flag = 0;                 continue;             }             if (i <= 0)    /* word is null. */                 continue;             word[i] = 0;             idx = is_exist(word, word_list, num);             if (idx >= 0) {   /* This word has existed*/                 strcpy(word_list[idx].word, word);                 word_list[idx].cnt++;             }else {    /* A new word. */                 strcpy(word_list[num].word, word);                 word_list[num].cnt++;                 num++;                 if (num == total_num) {                     break;                 }             }             i = 0;         }else if (ch == '-') {             flag = 1;             continue;         }     }      return num; }  static void print_words_list (struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++) {         printf("word: %s, cnt = %d\n", word_list[i].word, word_list[i].cnt);     } }  static void init_words_list(struct word_info *word_list, int num) {     int i;      for (i = 0; i < num; i++)         word_list[i].cnt = 0; }  int main(void) {     struct word_info word_list[MAX_WORD_NUM];     FILE *fp;     int cur_num = 0;      init_words_list(word_list, MAX_WORD_NUM);     fp = open_file("2.txt", "r");      /* read the word from the file. */     cur_num = read_words_list(fp, word_list, MAX_WORD_NUM);     printf("\nShow the word list: \n");     print_words_list(word_list, cur_num);      /* sort the word list. */     sort_as_char(word_list, cur_num);     sort_as_cnt(word_list, cur_num);     printf("\nAfter sort: \n");     print_words_list(word_list, cur_num);      fclose(fp);      return 0; }  /* int main() {     int i = 0, j = 0, l, m;     FILE *fp;     char a, fun[20], dan[10000][20];     struct cun word[10000], t;      if((fp = fopen("case1.in","r")) == NULL) {         perror("Open file error!\n");         exit(0);     }     while((a=fgetc(fp)) != EOF)     {         if(a >= 'A' && a <= 'Z')             a += 32;         if(a >= 'a' && a<= 'z')         {             fun[i] = a;             i++;         }         else         {             if(a == '-')             {                 if((a = fgetc(fp)) != '\n')                 {                     fun[i]='\0';                     strcpy(dan[j], fun);                     j++;                     i = 0;                     if((a >= 'A' && a <= 'Z')                        || (a >= 'a' && a <= 'z'))                     {                         if(a >= 'a' && a <= 'z') {                             fun[i] = a;                             i++;                         } else {                             a += 32;                             fun[i] = a;                             i++;                         }                     }                 }                 else                     continue;             } else             {                 fun[i] = '\0';                 strcpy(dan[j], fun);                 j++;                 i = 0;             }         }         if(j > 0 && dan[j-1][0] == '\0')             j--;     }     if(i != 0) {         fun[i] = '\0';         strcpy(dan[j], fun);         j++;     }     l = j;     strcpy(word[0].c,dan[0]);     for(i=1,m=1;i<l;i++)     {         for(j=0;j<i;j++)         {             if(strcmp(dan[i],dan[j]) == 0)                 break;             else                 continue;         }         if(j == i)         {             strcpy(word[m].c, dan[i]);             m++;         }     }     for(i = 0; i < m; i++)     {         for(j=0;j<l;j++)             if(strcmp(word[i].c,dan[j])==0)                 word[i].n++;     }     for(i=0;i<m;i++)         for(j=0;j<m-i;j++)         {             if((word[j].n<word[j+1].n)||(word[j].n==word[j+1].n&&strcmp(word[j].c,word[j+1].c)>0))             {                 t=word[j];                 word[j]=word[j+1];                 word[j+1]=t;             }         }     if(m<5) for(i=0;i<m;i++)         printf("%s %d\n",word[i].c,word[i].n);     else for(i=0;i<5;i++)         printf("%s %d\n",word[i].c,word[i].n);     fclose(fp);      return 0; } */  改了一下你的程序,对比一下作为一个参考吧. 代码太长,都写在main函数里,分不清功能.

user: user-5
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。