我有一个C程序进行以下比较:
void compare(char** args) {
if (find_in_args(args, ">") != -1) {
printf("In > block");
}
else if (find_in_args(args, "<") != -1) {
printf("In < block");
}
else if (find_in_args(args, "|") != -1) {
printf("In | block");
}
}
其中find_in_args()
遍历char*
数组,如下所示:
int find_in_args(char** args, char* target) {
int found = -1;
int i = 0;
while (i != 10) {
if (strcmp(args[i], target) != 0)
++i;
else {
found = i;
break;
}
}
return found;
}
如果target
恰好是“&gt;”,则程序会输出In > block
。如果target
碰巧是“&lt;”或“|”,程序输出Segmentation fault (core dumped)
。
但是,如果我移动“&lt;”阻止为第一个,程序将输出In < block
,如果target
碰巧是“&gt;”,则会给出分段错误错误或“|”。
使用char*
迭代strcmp()
数组的比较似乎只能一次。我已尝试为args
的每次调用复制find_in_args
并在副本上执行比较,但同样的问题也会发生。
有没有人知道为什么我只能调用一次比较函数,如果是这样,如何制作它以便我可以调用比较函数n次而不会出现分段错误?
答案 0 :(得分:0)
问题是由i != 10
循环中的while
引起的。根据条件while
更改args[i] != NULL
循环以进行迭代将解决问题。
答案 1 :(得分:0)
除此之外,此代码部分还绑定了segfault:
while (i != 10) {
if (strcmp(args[i], target) != 0)
++i;
您没有指定如何调用函数compare
,但看起来很可能没有正确分配args
指向char的10个指针。因此,当您在i
循环中增加while
时,它会指向某个无效/非法位置,因此会出现段错误。
一些建议:
10
的内容。compare
和find_in_args
函数中,有一个额外的参数来指示args
应该指向char的指针数。args