求助!!这个程序出了到底什么问题?为什么运行不了? 40C
 #include <stdio.h>
#include <stdlib.h>
#include "list.h"


int main()
{
    struct Word *head;
    head=creatLink();
    listToFile(head);
    return 0;
}

 #ifndef _LIST_H
#define _LIST_H

struct Word
{
     char japanese[20];//日文
     char kana[20];//假名
     int accent;//声调
     char property[10];//词性
     char chinese[30];//中文
     struct Sentense *head2;//句子结构体链表的头指针
     struct Word *next;//下一个结点地址
};

struct Sentense
{
     char sentense[50];//例句
     struct Sentense *next;//下一个结点地址
};

FILE *inputOneWord_F(struct Word *p,FILE *fp);
struct Word *creatLink();
FILE *outputOneWord_F(struct Word *t,FILE *fp);
void listToFile(struct Word *head);

#endif // _LIST_H

 #include <stdio.h>
#include <stdlib.h>
#include "list.h"
#define LEN sizeof(struct Word)
#define LEN2 sizeof(struct Sentense)


//将文件中一个Word结构体中的所有数据读入p所指向的链表结点,返回值为指针目前在文件中所在的位置
FILE *inputOneWord_F(struct Word *p,FILE *fp)
{
     char a;
     fscanf(fp,"%s%s%d%s%s",p->japanese,p->kana,&p->accent,p->property,p->chinese);
     struct Sentense *g,*tail=NULL; //新建Sentense结构体单链表

     p->head2=NULL;
     while(1){
        fgetc(fp);//吸收换行符
        a=fgetc(fp);//通过是否为换行符来判断当前单词有无例句
        if(a=='\n'||feof(fp)) break;   //说明此单词无例句返回指针目前在文件中所在的位置,进行下一个单词的读取
        else{
          fseek(fp,-1l,SEEK_CUR);//光标向前一个字符
          fputc(a,fp);//将刚才从文件读取的字符按原样写入文件(位置不变)
          g=(struct Sentense*)malloc(LEN2);//
          fscanf(fp,"%s",g->sentense);
          if(p->head2==NULL)p->head2=g;//如果链表为空,新建立的结点就是链表的头结点
          else tail->next=g;
          tail=g;//tail永远指向链表的尾结点

         }
     }
     tail->next=NULL;
     return fp;
}



 //在程序执行之初将上一次存储在文件中的全部数据读入新建Word结构体单链表,函数返回单链表头指针
struct Word *creatLink()
{
     struct Word *p,*head=NULL,*rear=NULL;
     FILE *fp;
     fp=fopen("WordList.txt","r");
     if(fp==NULL)
     {
          printf("单词表为空!");
          return head;
     }
     p=(struct Word*)malloc(LEN);
     fp=inputOneWord_F(p,fp);//更改指针在文件中所在的位置
     while(!feof(fp))
     {
          if(head==NULL)head=p;
          else rear->next=p;
          rear=p;
          p=(struct Word*)malloc(LEN);
          fp=inputOneWord_F(p,fp);
     }
     rear->next=p;
     rear=p;
     rear->next=NULL;
     fclose(fp);
     return head;
}

FILE *outputOneWord_F(struct Word *t,FILE *fp)
{

     fprintf(fp,"\n%s %s %d %s %s\n",t->japanese,t->kana,t->accent,t->property,t->chinese);
     struct Sentense *p;
     p=t->head2;  //p为指向Word结构体中Sentense结构体链表的头指针;
     while(p!=NULL)
     {
          fprintf(fp,"%s\n",p->sentense);
          p=p->next;
     }
     return fp;
}


//程序运行结束之际将链表中的数据全部写入文件
void listToFile(struct Word *head)
{
     FILE *fp;
     fp=fopen("WordList2.txt","w");
     struct Word *p;
     p=head;
     while(p!=NULL)
     {
          fp=outputOneWord_F(p,fp);
          p=p->next;
     }
     fclose(fp);
}





7个回答

你得把相应的文件传上来,wordlist.txt 这些文件,不然怎么做测试

多打log。在一些关键点打上log,很容易看出哪里出问题

图片说明

建议你先说明一下,你这个程序的设计意图、设计思路,另外,你可以通过断点调试查看问题出现在哪个环节。

查检一下环境配置,以及编码格式试试

你的程序要实现什么功能,你的算法逻辑要搞清楚,另外检查一下所需程序包是不是都装好了

一步一步调试,运行不了具体是什么情况,是运行后弹窗崩溃,还是运行后达不到你想要的结果?一般崩溃大都是由于内存原因,比如
使用了未分配内存的指针,使用了未初始化的内存,可以alt+6调出内存窗口观看各变量的内存情况;如果程序可以运行但是达不到你想
要的效果,那就要仔细想想每一步的逻辑,观察变量的值是否都符合预期。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问