无法弄清楚分段错误

时间:2015-08-03 21:34:56

标签: c arrays string if-statement char

我无法弄清楚我的细分错误来自哪里。我把它缩小到代码的功能和片段,但我很难过。介意看看它?

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

1 个答案:

答案 0 :(得分:0)

如果strtok()返回NULL,您需要摆脱循环。在您回到循环顶部的while测试之前,您不会检查它。但为时已晚,因为strtok()之后的代码尝试使用str

str = strtok(NULL, " ,.-#\n\t");
if (!str) {
    break;
}