0

私はプログラムをやっています.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%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;
}
4

2 に答える 2

0

を指すようにストレージを割り当てたりchar *、他の何かを指すように初期化したりしていません。その結果、基本的に乱数をに渡すことになりますfscanf。これにより、未定義動作が発生します。これは、プログラムのクラッシュが1つの可能性のある化身です。

于 2012-10-12T18:23:15.047 に答える
0

このコードにはいくつかの問題があります。

  • program.txt が存在しない場合、fopen() は NULL を返します。
  • fscanf(%[...]) または fscanf(%s) は char へのポインターを期待します。これには、テキストを読み取るための十分なスペースと、ヌル バイトを終了するスペースが必要です ( http://pubs.opengroup.org/onlinepubs/007904975/を参照)。 functions/scanf.html )
  • fscanf(%ld) は long ではなく long へのポインターを想定しています
于 2012-10-12T18:14:42.613 に答える