gpt4 book ai didi

c - 使用 fscanf 出现段错误

转载 作者:行者123 更新时间:2023-11-30 15:35:17 26 4
gpt4 key购买 nike

我为一些基本的文本处理工作编写了这段 C 代码。首先,我从文件中读取内容,然后根据某些字符将其拆分。然而,我在使用 gcc 编译时遇到段错误,并且当我使用 gdb 时,它输出 fscanf 行导致段错误。我已经阅读了 StackOverflow 上的许多文章,但没有一个建议的解决方案可以解决我的问题。谢谢

输出

Number of Lines 9
LXI B
Segmentation fault

SIGSEGV 原因的 gdb 输出

#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

波尔:LDA 4150

标签:移动E,A

LOB:STAX 2130

MOV D,A

循环:MVI A,23

LXI H,76AC

HLT

最佳答案

你的问题是这一行。

 char instr[10];

当到达asm.txt的第3行时,即LABEL:MOV E,A,您分配的空间不足。我将空间增加到 20,程序开始运行。

 char instr[20];

关于c - 使用 fscanf 出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com