【发布时间】:2020-12-31 09:14:39
【问题描述】:
我的程序有问题,我从 strsep() 收到分段错误,该错误是从 GDB 获得的,并且有错误消息
Program received signal SIGSEGV, Segmentation fault.
0x00002aaaaad64550 in strsep () from /lib64/libc.so.6
我的代码如下:
int split(char *string, char *commands, char *character) {
char **sp = &string;
char *temp;
temp = strdup(string);
sp = &temp;
for (int i = 0; i < 100; i++) {
commands[i] = strsep(sp, character);
if (commands[i] == '\0') {
return 0;
}
if (strcasecmp(commands[i], "") == 0) {
i--;
}
printf("%d", i);
}
return 0;
}
任何帮助都将不胜感激,因为我花了几个小时试图解决这个问题
函数的参数是("Hello World", "@", "&")
编辑
所以我设法通过将代码更改为来摆脱段错误
int split(char* string, char* commands, char* character) {
for(int i = 0; i < 100; i++) {
commands[i] = strsep(&string, character);
if(commands[i] == '\0') {
return 0;
}
if(strcasecmp(&commands[i], "") == 0) {
i--;
}
}
return 0;
}
但是现在我遇到了一个新问题,即返回每个索引都超出范围的空数组的命令。
编辑 2
我还应该澄清一下我正在尝试做的事情,所以基本上命令的类型是char* commands[100],我想在修改原始指针数组并存储时将它传递给函数并说“Hello World”进入 commands[0] 然后我想在函数之外修改这个值。
【问题讨论】:
-
什么是
commands?请发布一个重现问题的整个程序,包括对该函数的调用。 -
您将一个指向字符的指针分配给
commands[i],它是一个char。您可能正在做的事情会覆盖 strsep 所作用的指针。 -
我现在不能尝试这个,所以我不会发布答案,但看起来你想摆脱前 4 行(
sp和temp变量) , 并将其称为strsep(&string, character)。还要检查string是否设置为null。 -
AFAICS,段错误来自写入字符串文字。
strsep()尝试修改Hello World(至少如果您传递了一个空格而不是@符号),然后也尝试修改command。我认为你也在滥用strsep()。我希望将&string作为第一个参数传递,而不是sp,即使sp中的值是&string。至少,这是它更传统的用法。 -
是的,很抱歉我看到 docs.oracle.com/cd/E19048-01/chorus401/806-4422/6jdgkltde/… 作为如何使用 strsep 的示例的混乱
标签: c segmentation-fault strsep