2014-04-10 116 views
0

我編寫了一些基本的文本處理工作的C代碼。首先即時從文件中讀取,然後根據特定字符進行分割。但是,我使用gcc編譯時遇到了分段錯誤,而當我使用gdb時,輸出fscanf行導致了分段錯誤。我已經通過了一些關於StackOverflow的文章,但是沒有一個建議的解決方案能夠解決我的問題。 由於使用fscanf分段錯誤

輸出

Number of Lines 9 
LXI B 
Segmentation fault 

GDB輸出SIGSEGV

#0 0xb7eb0c5d in __isoc99_fscanf() 
    from /lib/i386-linux-gnu/i686/cmov/libc.so.6 
#1 0x08048af5 in setupTables() at simGen.c:132 
#2 0x08048687 in main() at simGen.c:26 

的原因simGen.c

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#include<strings.h> 
#include<ctype.h> 
#include<malloc.h> 

#define newlineCheck(t,flg){\ 
          if(t == '\n'){\ 
           flg=1;\ 
          }}\ 


//GLOBAL VARS 
char mnem[50][10],op1[50][5],op2[50][5]; 


FILE *fp; 

void setupTables(); 
int compare(char *,char *); 

int main(){ 
    setupTables(); 
    return 0; 
} 

int compare(char *a,char *b){ 
    if(strcmp(a,b)){ 
     return 0; 
    }else{ 
     return 1; 
    } 
} 

void setupTables(){ 
    char tempch = 'a'; 
    int commapos = 0,spacepos = 0,digitFlag = 0,colonpos = 0,i = 0; 
    char instr[10]; 
    int counter,num_lines = 1,line_counter = 1; 
    FILE* fp = fopen("asm.txt","r"); 
    while(fscanf(fp,"%c",&tempch)!=EOF){ 
     if(tempch == '\n'){ 
      num_lines++; 
     } 
    } 

    printf("Number of Lines %d\n",num_lines); 
    rewind(fp); 
    do{ 
     counter = 0; 
     spacepos = 0; 
     commapos = 0; 
     digitFlag = 0; 
     colonpos = 0; 
     do{ 
      fscanf(fp,"%c",&tempch);// <- this line seems to be causing segmentation fault 
      instr[counter] = tempch; 
      if(isdigit(tempch)) 
       digitFlag = 1; 
      if(tempch == ' ') 
       spacepos = counter; 
      if(tempch == ',') 
       commapos = counter; 
      if(tempch == ':') 
       colonpos = counter; 
      counter++; 
     }while(tempch != '\n'); 
     instr[counter - 2] = '\0'; 

     if(digitFlag == 0){ 
      i = 0; 
      if(colonpos == 0){ 
       do{ 
        mnem[line_counter - 1][i] = instr[i]; 
        i++; 
       }while(instr[i-1] != '\0'); 
      }else{ 
       do{ 
        //mnem[line_counter - 1][i] = instr[i]; 
        i++; 
       }while(instr[i-1] != ':'); 
       int j = 0; 
       do{ 
        mnem[line_counter - 1][j] = instr[i]; 
        j++; 
        i++; 
       }while(instr[i-1] != '\0'); 
      } 
     }else{ 
      if(colonpos == 0){ 
        if(commapos == 0){ 
         for(i = 0;i <= spacepos;i++){ 
          mnem[line_counter - 1][i] = instr[i]; 
         } 
         mnem[line_counter - 1][spacepos] = '\0'; 
        }else{ 
         for(i = 0;i <= commapos;i++){ 
          mnem[line_counter - 1][i] = instr[i]; 
         } 
         mnem[line_counter - 1][commapos] = '\0'; 
        } 
       }else{ 
        int j = 0; 
        do{ 
        //mnem[line_counter - 1][i] = instr[i]; 
        j++; 
       }while(instr[j-1] != ':'); 
        if(commapos == 0){ 
         for(i = 0;i <= spacepos - j + 2;i++){ 
          mnem[line_counter - 1][i] = instr[j]; 
          j++; 
         } 
         mnem[line_counter - 1][spacepos] = '\0'; 
        }else{ 
         for(i = 0;i <= commapos - j + 3;i++){ 
          mnem[line_counter - 1][i] = instr[j]; 
          j++; 
         } 
         mnem[line_counter - 1][commapos] = '\0'; 
        } 
       } 
      } 
      printf("%s\n",mnem[line_counter - 1]); 
      line_counter++; 
     }while(line_counter!=num_lines); 
} 

asm.txt

LXI B,501A

POL:LDA 4150

LABEL:MOV E,A

LOB:STAX 2130

MOV d,A

LOOP:MVI A,23

LXIħ ,76AC

HLT

+0

我注意到你沒有檢查fopen()失敗,所以fp可能是一個空指針。建議您添加支票,至少要排除這種可能性。 – nephtes

+0

大多數情況下,它不是打印LXI B,501A後出現分段錯誤,我應該在這個問題本身添加 – user27812

+0

嗯,好的,第二次猜測:你的instr數組只有10個字符,並且你的輸入文件的行長度超過那。你超出了數組和堆棧變量,可能包括fp。 – nephtes

回答

1

你的問題是這條線。

char instr[10]; 

當它到達上asm.txt 3號線,即通過LABEL:MOV E,A您分配的空間不足。我將這個空間增加到了20個,並且程序工作。

char instr[20]; 
+0

instr在處理每行後重置... – user27812