我正在尝试开发一个基本的shell。对于那个shell,我需要一个C函数来解析一个字符串。因为我是C的新手,我试图开发一个基本功能,它给了我一个分段错误错误。请告诉我我错过了什么。
#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)
提前致谢
答案 0 :(得分:5)
msg
指向字符串文字,并且您正在尝试修改它。在C中,修改字符串文字是undefined behaviour(实际上,编译器通常将它们放在只读内存中)。
要修复,请将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," ");
}
}
答案 1 :(得分:4)
您无法可靠地修改字符串文字;它们通常是只读的(在你的情况下,显然是只读)。尝试修改字符串文字会调用未定义的行为,这始终是Bad Thing™!
使用:
int main(void)
{
char msg[] = "This is a message";
parse(msg);
}
答案 2 :(得分:2)
您的定义:
char *msg = "This is a message";
将msg
作为常量char字符串,无法修改。但strtok
修改了它。
您可能想将其更改为
char *msg = strdup("This is a message");
完成后不要忘记释放指针。
答案 3 :(得分:1)
也许不是
while(tok == NULL)
你的意思
while(tok != NULL)
或只是
while (tok) // <- because in C, conditions are always compared to 0
。但是,为您提供分段错误的原因是strtok
修改了传递的字符串,这就是为什么它需要非const 指向char
的原因(参见http://linux.die.net/man/3/strtok )。因此,因为您正在传递一个指向不可修改的字符串文字的指针,您会收到一个分段错误(这是您的运气;如果您运气不好,这个错误也可能会漏掉QA并投入生产)。
答案 4 :(得分: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," ");
}
}
答案 5 :(得分:0)
如何将tok == NULL更改为tok!= NULL