我无法弄清楚我的细分错误来自哪里。我把它缩小到代码的功能和片段,但我很难过。介意看看它?
P.S。我要求你们对负面投票不要太苛刻。我是一名学生,我正在教我自己。更不用说我操纵字符串这是一个痛苦的c所以我理解我的代码看起来像垃圾。但请给我一个休息时间。这就是我在这里学习的原因。
无论如何,让我知道你还需要什么,并提前感谢。
这是控制台输出。
rpf0024@cse02:~/cse2610$ gcc -std=gnu99 main.c rpf0024@cse02:~/cse2610$ ./a.out # A demonstration of some simple MIPS instructions Loop: sll $t1, $s3, add $t1, $t1, $s6 lw $t0, 0($t1) bne $t0, $s5, Exit addi $s3, $s3, 1 j Loop Exit: Line: 0 # Line: 1 Line: 2 Loop Line: 3 add Line: 4 lw Line: 5 bne Line: 6 addi Line: 7 j Line: 8 Exit WompWompWompSplitting string: add $t1 $t1 $s6 Segmentation fault (core dumped) rpf0024@cse02:~/cse2610$
Assem.c - 我已经验证了分段错误在我的一批“if”语句中。我删除了整个代码块,我的程序运行得很好。
int checkRformat(char *LineArray, struct assem item)
{
int i = 0;
char *str;
char *temp;
item.opcode = NULL;
item.shamt = NULL;
item.funct = NULL;
item.rs = NULL;
item.rt = NULL;
item.rd = NULL;
printf("Splitting string:\n");
temp = strdup(LineArray);
str = strtok(temp, " ,.-#\n\t");
//this helper function gets called by another.It primarily serves to convert the MIPS code
//instructions or labels into their binary values. These global variables will then concatenated
// and be printed onto a .txt file.
while(str != NULL)
{
printf("%s\n", str);
str = strtok(NULL, " ,.-#\n\t");
if(strcmp(str, "add"))
{
item.opcode = "000000";
item.shamt = "00000";
item.funct = "10100";
}
else if(strcmp(str, "$t0"))
{
if(strcmp(item.rs, NULL)){item.rs = "01000";}
else if(item.rt, NULL){item.rt = "01000";}
else if(item.rd,NULL){item.rd = "01000";}
}
else if(strcmp(str, "$t1"))
{
if(strcmp(item.rs,NULL)){item.rs = "01001";}
else if(item.rt,NULL){item.rt = "01001";}
else if(item.rd,NULL){item.rd = "01001";}
}
else if(strcmp(str, "$s6"))
{
if(strcmp(item.rs,NULL)){item.rs = "11110";}
else if(item.rt,NULL){item.rt = "11110";}
else if(item.rd,NULL){item.rd = "11110";}
}
}
}
assem.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct assem
{
char myString[101]; //buffer
char *myLines[20]; //this will store the lines from a text file..up to 20 lines
char *myLines2[20];
char *myWord[20]; //this stores the 1st words individually.
char *opcode;
char *rs;
char *rt;
char *rd;
char *shamt;
char *funct;
char counter; //counter for number of lines
//printing stuff...prints file directly from whats STORED IN THE ARRAY
};
int readFile(FILE *FileToBeRead, struct assem *item); //takes in the file that needs to be read and splits it into lines
int firstCheck(struct assem item);
int secondCheck(struct assem item);
int checkRformat(char *LineArray, struct assem item);
int checkFormat1(char *LineArray,struct assem item, int offset);
int checkFormat2(char *LineArray, struct assem item, int offset);
int checkFormat3(char *LineArray, struct assem item, int offset);
int checkFormat4(char *LineArray, struct assem item, int offset);
int checkFormat5(char *LineArray, struct assem item, int offset);
int checkFormat6(char *LineArray, struct assem item);
int checkFormat7(char *LineArray, struct assem item);
int checkLabel1(char *Array, struct assem item);
int checkLabel2(char *Array, struct assem item);
int checkLabel3(char *Array, struct assem item);
//int checkSyntax1(char *LineArray, struct assem item);
void removeSpaces(char* str_trimmed, const char* str_untrimmed, struct assem *item); //HELPER FUNCTIONS TO REMOVE SPACES
void ReadWords(struct assem *item); //stores the first word of each line in an array for evaluation
void printFile(struct assem item); //prints some stuff
void printWords(struct assem item); //checks the first character if its instruction, label, or comment
答案 0 :(得分:0)
如果strtok()
返回NULL
,您需要摆脱循环。在您回到循环顶部的while
测试之前,您不会检查它。但为时已晚,因为strtok()
之后的代码尝试使用str
。
str = strtok(NULL, " ,.-#\n\t");
if (!str) {
break;
}