feof or fscanf error

feof or fscanf error

本文关键字:error fscanf or feof      更新时间:2023-10-16

我正在做一个程序,我使用Dev C++。运行时我的程序终止。在调试时,它显示"分段错误"。我不知道它是否会走向无限循环。我不知道问题出在代码中的while(!feof(program))还是fscanf(...)

任何人都可以帮助解决这个问题吗?请参阅下面的程序:

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    fpos_t curDesStart,curDesEnd;
    fpos_t curDesLocBackup,curDes;
    char *label,*opc,*operands;
    char *curMacroName;
    FILE *namTab,*desTab,*temp,*program;
    namTab=fopen("namTab.txt","rw");
    desTab=fopen("desTab.txt","rw");
    temp=fopen("temp.txt","w");
    program=fopen("program.txt","r");
    while(!feof(program))
    {
        fscanf(program,"%[^n]%[^n]%[^n]",label,opc,operands);
        if(!strcmp(label,"MACRO"))
        {
            fprintf(desTab,"%s%s%sn",label,opc,operands);
            fgetpos(desTab,&curDesStart);
            strcpy(curMacroName,label);
            while(!strcmp(opc,"MEND"))
            {
                fscanf(program,"%s%s%s",label,opc,operands);
            }
            fprintf(desTab,"%s%s%sn",label,opc,operands);
            fgetpos(desTab,&curDesEnd);
            fprintf(namTab,"%s%ld%ldn",curMacroName,curDesStart,curDesEnd);
        }
        else
        {
            while(!feof(namTab))
            {
                fgetpos(desTab,&curDesLocBackup);
                fscanf(namTab,"%s%ld%ld",curMacroName,curDesStart,curDesEnd);
                if(!strcmp(curMacroName,label))
                {
                    fsetpos(desTab,&curDesStart);
                    fscanf(desTab,"%s%s%sn",label,opc,operands);
                    fprintf(temp,".%s%s%sn",label,opc,operands);
                    do{
                        fprintf(temp,"%s%s%sn",label,opc,operands);
                        fgetpos(desTab,&curDes);
                    }while(curDes<=curDesEnd);
                    fsetpos(desTab,&curDesLocBackup);
                    fsetpos(namTab,0);
                }
                else
                {
                    fprintf(temp,"%s%s%sn",label,opc,operands);
                }
            }
        }
    }
    fclose(program);
    fclose(namTab);
    fclose(desTab);
    fclose(temp);
    getch();
    return 0;
}

此代码存在几个问题:

  • 如果 program.txt 不存在,fopen() 将返回 NULL
  • fscanf(%[...]) 或 fscanf(%s) 需要一个指向 char 的指针,该指针必须提供足够的文本读取和终止 NUL 字节的空间(请参阅 http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)
  • fscanf(%ld) 期望指针指向 long,而不是 long

您既没有为要指向的任何char *分配存储空间,甚至也没有初始化它们以指向其他内容。结果,您实际上是将随机数传递到fscanf,这会导致未定义的行为,其中程序崩溃是一种可能的化身。

相关文章: