- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的程序已经完全完成,并且可以在 Ubuntu 12.04 中正常运行。但是,当我尝试在 Debian VM 上编译它时,它给了我一个段错误。给出段错误的代码是:
printf("Going to location: /bin/%s\n", input2[0]);
Input2 是一个 char*,因为我需要使用 strtok 函数(我相信需要 char* 作为参数)。我在下面发布了我的代码,以及 Eclipse 调试的变量窗口以显示数组中的值。
这是帮助我解决问题的变量窗口:
我最初认为错误出在 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/
我正在寻找将数组中的单词与另一个数组中的字典中的单词进行比较,以查找找到的最大单词数 我使用了 strtok,因为两者中的单词都是用空格分隔的,但它不起作用。我需要你的帮助,请 void cherc
我在这个程序上花了几个小时,并花了几个小时在网上搜索我的方法的替代方案,但整个晚上都被崩溃和错误所困扰…… 我有几件事想用这段代码实现。首先我会解释我的问题,然后我会发布代码,最后我会解释我对这个程序
我希望使用 strtok() 解析以下字符串。 DINNER;NME=Tom Johnson;ADRES=1234 Street;TIME="12:00","15:00":Formal 有没有一种方法
这个问题在这里已经有了答案: Nested strtok function problem in C [duplicate] (2 个答案) 关闭 6 年前。 我意识到标题令人困惑,想不出更清晰的措
只是为了好玩,我正在编写一个程序,它将接受用户输入的字符串(甚至可能是文本文档)并打乱字符串中的单词。 我正在尝试使用 strtok 函数来分隔字符串中的每个单词。目前我觉得我当前的 strtok 实
如果我欺骗了主题,我真的很抱歉,我在这里搜索它没有结果。 我有代码 void split(char* str, char* splitstr) { char* p; char sp
strtok() 函数使用静态变量。 因此它不是可重入的。并且不能用于解析多个字符串。 我想知道的是为什么 strtok() 是这样设计的? strtok_r() 应该是 strtok()。 这个函数
我是 C 编程的新手,目前正在努力使用 strtok。我想使用以下代码将一个字符串拆分为两个字符串(字符串是例如“Bat1:185”,分隔符是冒号): char batName[13]; char b
我正在写一个 C 程序来研究函数的用法 strtok() .这是我的代码: #include #include main() { char abc[100] = "ls &"; c
我正在尝试分割以下类型的行: GM 1 2 3 ! this is a comment 分离出评论部分。有几种可能的注释分隔符:!、' 和 #。 strtok 是明显的解决方案: card->card
我需要将 C 字符串划分为标记。我认为 strtok 将是我最好的尝试,但我得到了非常奇怪的结果...... 这是我的测试程序。在这个例子中,我将得到 3 个带有“##”分隔符的 token ,但是当
我正在使用库的 strtok(...) 并且它似乎工作正常,直到结束条件,导致段错误和程序崩溃。 API 声称 strtok(...) 将在找不到更多标记时输出 NULL,这意味着,我认为,您必须捕获
我有包含歌曲详细信息的链接列表,想要比较两个歌曲名称...附加任务是通过比不同单词更多的相似单词来比较它们...我使用 strtok 逐字获取它,然后检查如果当前单词包含在另一个名称中...但是当我这
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我尝试编写一个函数,该函数获取指向字符数组的指针,从用户读取字符串并删除字符串开头的所有空格,直到出现第一个不是字符串的字符。最后返回开头不带空格的字符串副本。 例如, 对于输入abcd,函数应返回指
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
当我尝试分离 token “(555) 333-444”时,下面的代码没有给出所需的输出。我需要函数来分别分离所有这些 555、333、444。我的错误可能是什么? 输出: 555 333-444 #
这个问题已经有答案了: How does strtok() split the string into tokens in C? (16 个回答) 已关闭 7 年前。 抱歉,这可能是一个愚蠢的问题,但
#include #include #include #define MAX_INPUT_LENGTH 1024 char *readline(FILE* fp, int max_length)
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我是一名优秀的程序员,十分优秀!