我的代码中的c中的分段错误。

时间:2014-11-16 22:51:44

标签: c segmentation-fault command-prompt

我正在使用c创建一个简单的unix shell。如果有两个命令:“set prompt”改变了用户提示,“退出”退出程序,系统会处理任何其他命令。我有以下代码但我不断得到分段错误。我错误访问的是什么请帮助。

int main(int argc, char *argv[])
{
    char cmdLine[BUFSIZ];
    char *cmdPrompt = "$PROMPT:";
    {
        if(argc!=1)
        {
            printf("error: Incorrect number of arguments on command line");
        }
        else
        {
            while(1) //This creates an infinite loop as 1 will never be equals 0
            {
                printf("%s", cmdPrompt);                    //Prints the current Prompt on the screen
                fgets(cmdLine, sizeof(cmdLine), stdin);     //puts the user input into the cmdLine array
                char *token = strtok(cmdLine, " \n");        //tokenizes the user input with delimitters space or enter

                if(strcasecmp(token, "QUIT")==0)            //checks if the user input is "quit"
                {
                    exit(EXIT_SUCCESS);                     //successfully exits program
                }
                else if(strcasecmp(token, "SET")==0)        //checks if the first part of user input is "set"
                {
                    token = strtok(NULL, " \n");             
                    if(strcasecmp(token, "PROMPT")==0)      //checks to see if the next part is promt
                    {
                        token = strtok(NULL, "\n");         
                        cmdPrompt = token;                  //changes the user prompt
                    }
                else
                    {
                        system(cmdLine);                    //all other commands taken care of by the system
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

从手册页(Unix shell中的man strtok):

  

返回值

     

strtok()和strtok_r()函数返回指向下一个标记的指针,如果没有更多标记,则返回NULL。

这意味着您需要确保返回值(token)在使用之前不是NULL指针。

如果system()变量包含cmdLine字符,'\n'调用也可能不喜欢。

此外,fgets()可以在错误上返回NULL:

  

返回值

     

gets()和fgets()成功返回s,错误时返回NULL或文件结束时没有读取任何字符。

你应该对那个很好。