gpt4 book ai didi

c - 在 Ubuntu 中运行,在 Debian 中运行 SegFault(C,strtok)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:28 25 4
gpt4 key购买 nike

我的程序已经完全完成,并且可以在 Ubuntu 12.04 中正常运行。但是,当我尝试在 Debian VM 上编译它时,它给了我一个段错误。给出段错误的代码是:

printf("Going to location: /bin/%s\n", input2[0]);

Input2 是一个 char*,因为我需要使用 strtok 函数(我相信需要 char* 作为参数)。我在下面发布了我的代码,以及 Eclipse 调试的变量窗口以显示数组中的值。

这是帮助我解决问题的变量窗口: enter image description here

我最初认为错误出在 array2 本身,因为未使用的值以 0x0 而不是\0 终止。后来我发现 0x0 和\0 只是表达空终止符的不同方式,所以这不是问题所在。我也试过了

printf("Going to location: /bin/%s\n", *input2[0]); 

取消引用是因为 input2 应该是一个指向字符串的指针,但这也不起作用。

我在这里很困惑;问题是由于 Ubuntu 和 Debian 之间的差异造成的,还是实际上是因为我如何使用我的阵列造成的?我倾向于后者,但我很困惑哪里出了问题。

这是出现段错误之前的代码。剩下的只是 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 makes pointer from integer without cast”。我现在将检查这些内容。

最佳答案

您使数组 input 足够大以容纳 14 个字符和一个终止符,但您告诉 fgets() 它足够大以容纳 99 个字符。如果程序读取超过14.

您将输入标记为不可预测数量的标记,但最多为 5 个标记保留空间。如果输入包含更多标记,则您有未定义的行为。

您假设如果“&”字符出现在输入中,那么它就在末尾,作为一个单独的标记。

如果输入是空行,则 strtok() 可能会为第一个标记返回 NULL,这可能会导致指示行出现段错误。

但是,如果 input2[0] 的值与问题中描述的一样,那么 printf() 就没有理由出现段错误。我得出结论,要么变量包含不同的东西,要么段错误发生在其他地方。

关于c - 在 Ubuntu 中运行,在 Debian 中运行 SegFault(C,strtok),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com