首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有限误差或fscanf误差

有限误差或fscanf误差
EN

Stack Overflow用户
提问于 2012-10-12 17:57:53
回答 2查看 807关注 0票数 0

我正在做一个程序,我使用Dev C++。在运行我的程序时终止。在调试时,它说‘分段故障’。我不知道是否会有无穷大的循环。我不知道问题是代码中的while(!feof(program))还是fscanf(...)

有人能帮忙解决这个问题吗?请参阅我的程序如下:

代码语言:javascript
复制
#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%s\n",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%s\n",label,opc,operands);
            fgetpos(desTab,&curDesEnd);

            fprintf(namTab,"%s%ld%ld\n",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%s\n",label,opc,operands);
                    fprintf(temp,".%s%s%s\n",label,opc,operands);

                    do{
                        fprintf(temp,"%s%s%s\n",label,opc,operands);
                        fgetpos(desTab,&curDes);
                    }while(curDes<=curDesEnd);

                    fsetpos(desTab,&curDesLocBackup);
                    fsetpos(namTab,0);
                }
                else
                {
                    fprintf(temp,"%s%s%s\n",label,opc,operands);
                }
            }

        }
    }
    fclose(program);
    fclose(namTab);
    fclose(desTab);
    fclose(temp);
    getch();
    return 0;
}
EN

回答 2

Stack Overflow用户

发布于 2012-10-12 18:14:42

此代码有几个问题:

  • 如果program.txt不存在,fopen()将返回NULL
  • (%.)或者fscanf(%s)需要一个指向char的指针,它必须为文本读取和终止nul字节提供足够的空间(参见http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)
  • (%ld)期望指针指向长,而不是长
票数 0
EN

Stack Overflow用户

发布于 2012-10-12 18:23:15

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12864603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档