-4

我正在尝试开发一个基本的外壳。对于那个 shell,我需要一个 C 函数来解析一个字符串。由于我是 CI 新手,我试图开发一个基本功能,但它给了我一个分段错误错误。请告诉我我错过了什么。

#include<string.h>
#include<stdio.h>


void parse(char *msg);
int main()
{
    char *msg =  "This is a message";
    parse(msg);
}

void parse(char *msg){
    char *mm;
    mm = msg;

    char *tok;
    tok = strtok(mm," ");
    while(tok == NULL){
        tok = strtok(NULL," ");
            printf("%s \n",tok);
    }
}

错误消息(运行时)

Segmentation fault (core dumped)

提前致谢

4

6 回答 6

5

msg指向一个字符串文字,并且您正在尝试修改它。在 C 中,修改字符串文字是未定义的行为(实际上,编译器通常将它们放在只读内存中)。

要修复,请msg转换为数组:

int main()
{
    char msg[] =  "This is a message";
    parse(msg);
}

此外,您的while循环存在几个问题:

1) 条件错误;
2)第二个电话strtok()应该出现.printf()

void parse(char *msg){
    char *mm = msg;
    char *tok = strtok(mm, " ");
    while (tok) {
        printf("%s \n",tok);
        tok = strtok(NULL," ");
    }
}
于 2013-04-09T05:46:06.267 回答
4

您不能可靠地修改字符串文字;它们通常是只读的(在您的情况下,显然是只读的)。尝试修改字符串文字会调用未定义的行为,这总是一件坏事™!

利用:

int main(void)
{
    char msg[] = "This is a message";
    parse(msg);
}
于 2013-04-09T05:46:03.140 回答
2

你的定义:

char *msg =  "This is a message";

制作msg为无法修改的常量字符字符串。但是strtok修改它。

您可能希望将其更改为

char *msg =  strdup("This is a message");

完成后不要忘记释放指针。

于 2013-04-09T05:47:28.113 回答
1

随它去吧…………

#include<string.h>
#include<stdio.h>


void parse(char *msg);
int main()
{
    char msg[] =  "This is a message";
    parse(msg);
}

void parse(char *msg){
    char *mm;
    mm = msg;

    char *tok;
    tok = strtok(mm," ");
    while(tok != NULL){
        printf("%s \n",tok);
    tok = strtok(NULL," ");
    }
}
于 2013-04-09T05:54:08.953 回答
1

也许代替

while(tok == NULL)

你的意思是

while(tok != NULL)

要不就

while (tok) // <- because in C, conditions are always compared to 0

. 但是,给您带来分段错误的是strtok修改了传递的字符串,这就是为什么它需要一个非常量指针char(参见http://linux.die.net/man/3/strtok)。因此,因为您传递了一个指向不可修改的字符串文字的指针,所以您会收到分段错误(这是您的运气;如果您不走运,此错误也可能会通过 QA 并投入生产)。

于 2013-04-09T05:46:21.170 回答
0

如何将 tok==NULL 更改为 tok!=NULL

于 2013-04-09T05:48:10.187 回答