我的程序已经完成,并且在Ubuntu 12.04中完全正常工作。但是,当我尝试在Debian VM上编译它时,它会给我一个段错误。给出段错误的代码是:
printf("Going to location: /bin/%s\n", input2[0]);
Input2是一个char *,因为我需要使用strtok函数(我相信需要char *作为参数)。我在下面发布了我的代码,以及Eclipse调试的Variable窗口,以显示数组中的值。
这是帮助我提问的变量窗口:
我原本以为错误发生在array2本身,因为未使用的值以0x0而不是\ 0结尾。我后来发现0x0和\ 0只是表达空终止符的不同方式,所以这不是问题。我也试过
printf("Going to location: /bin/%s\n", *input2[0]);
使用dereference,因为input2应该是一个指向字符串的指针,但这也不起作用。
我在这里很困惑;是由于Ubuntu和Debian之间的差异导致的问题,还是问题实际上是因为我如何使用我的数组?我倾向于后者,但我对于出了什么问题感到很困惑。
这是我的代码,直到segfault。其余的只是fork()和execvp(),它可以正常工作:
int flag = 0;
int i = 0;
int status;
char *s; //for strchr, strtok
char input[15] = "";
char *input2[5];
//char input2[5];
//Prompt
printf("Please enter prompt:\n");
//Reads in input
fgets(input, 14, stdin);
//Remove \n
int len = strlen(input); //Warning: Implicit declaration of strlen and Incompatible implicit declaration of built-in function strlen
if (len > 0 && input[len-1] == '\n')
input[len-1] = ' ';
//Check for & via strchr
s = strchr (input, '&'); //Warning: Implicit declaration of strchr and Incompatible implicit declaration of built-in function strchr
if (s != NULL) { //If there is a &
printf("'&' detected. Program not waiting.\n");
//printf ("'&' Found at %s\n", s);
flag = 1;
}
//Now for strtok
input2[i] = strtok(input, " "); //Warning: Implicit declaration of function strtok and Assignment makes pointer from integer without cast
while(input2[i] != NULL)
{
input2[++i] = strtok( NULL, " "); //Assignment makes pointer from integer without cast
}
if (flag == 1) {
i = i - 1; //Removes & from total number of arguments
}
//Sets null terminator for unused slots. (Is this step necessary? Does the C compiler know when to stop?)
int c = i;
while (c < 5) {
input2[c] = '\0';
c++;
}
printf("Going to location: /bin/%s\n", input2[0]); //SegFault
修改:我已将警告作为评论添加到我的代码中。它们中的大多数是隐式声明警告,并且一些是“Assignment使得指针来自整数而不是强制转换”。我现在要检查这些。
答案 0 :(得分:3)
使数组input
足够大以容纳14个字符加一个终结符,但是你告诉fgets()它足够大以容纳99.如果程序读取超过14,你有未定义的行为。 / p>
您将输入标记为不可预测数量的标记,但是您最多可以预留空间5.如果输入包含更多,则表示您有未定义的行为。
你认为如果&#39;&amp;&#39;字符存在于输入中,然后它作为单独的标记结束。
如果输入是一个空行,那么strtok()
可能会为第一个标记返回NULL,这可能会在指定的行上导致段错误。
input2 [0]的值如问题所示,然而printf()
没有理由进行段错误。我得出结论,变量包含不同的东西,或者段错在其他地方发生。
答案 1 :(得分:2)
我发现了错误!
正如你们有些人建议的那样,我正在查看我的警告,在查看Stack Overflow上的隐式声明警告帖时,我发现我错过了:
#include <string.h>
头。这解决了一切!我现在没有错误。
虽然我仍然有点困惑。 string.h给了我什么,这使我的程序不能提前工作?我注意到string.h包含size_t,它是strlen和strchr的返回类型。是吗?它还包含一个NULL&#34;宏&#34;包含空指针常量的值。有什么特别之处将它与之前的NULL分开?
最后,在什么情况下程序需要包含string.h?是否只有当我们想要使用与字符串相关的函数(如strchr,strcat,strcpy等)时才需要包含它?在正常情况下,当我们只想使用字符串来存储短语时,我们不需要包含string.h,这是正确的吗?
再次感谢您的帮助!