我对此错误"错误"。该函数将命令与其参数与字符串分开。我正在使用strtok。我很确定是愚蠢的,但我无法看到它。 功能是:
int dataCommand(char command[], char *data[]){
char *ch;
printf("Split \"%s\"\n", command);
ch = strtok(command, "_");
int i = 0;
data[i] = ch;
printf("%s\n", data[i]);
while (ch != NULL) {
ch = strtok(NULL, "_");
data[++i] = ch;
printf("Valor ch Salida: %s\n", ch);
}
printf("dataCommand END");
return 0;
}
此功能的调用是:
char *data[MAX_PARAM]; //MAX_PARAM = 80
char command[] ="UMBR_Donostia_1_2";
dataCommand(command,data);
屏幕上的结果:
Split "UMBR_Donostia_1_2"
UMBR
Valor ch Salida: Donostia
Valor ch Salida: 1
Valor ch Salida: 2
Segmentation fault (core dumped)
我一直在调查,我发现的大多数错误是使用char * over strtok,所以他们使用的是文字,但我使用char []。我不知道还有什么。感谢。
答案 0 :(得分:2)
在你的循环内部,你正在调用strtok
来获取下一个标记,但在使用它之前你没有检查它是否为NULL。
重新格式化以将strtok
放在循环的末尾,如下所示:
int dataCommand(char command[], char *data[]){
char *ch;
printf("Split \"%s\"\n", command);
int i = 0;
ch = strtok(command, "_");
while (ch != NULL) {
data[i++] = ch;
printf("Valor ch Salida: %s\n", ch);
ch = strtok(NULL, "_");
}
printf("dataCommand END");
return 0;
}
另请注意,循环之前的一些冗余代码已被删除,转而使用循环中的代码。
答案 1 :(得分:1)
我的编译器程序的结果:
Split "UMBR_Donostia_1_2"
UMBR
Valor ch Salida: Donostia
Valor ch Salida: 1
Valor ch Salida: 2
Valor ch Salida: (null)
显然,您正在向其传递空值。
[UPD1]
#include <stdio.h>
#include <string.h>
#define MAX_PARAM 80
int dataCommand(char command[], char *data[]){
char *ch;
printf("Split \"%s\"\n", command);
int i = 0;
ch = strtok(command, "_");
while (ch != NULL)
{
data[i++] = ch;
printf("Valor ch Salida: %s\n", ch);
ch = strtok(NULL, "_");
}
printf("dataCommand END");
return 0;
}
int main()
{
char *data[MAX_PARAM]; //MAX_PARAM = 80
char command[] ="UMBR_Donostia_1_2";
dataCommand(command,data);
return 0;
}
答案 2 :(得分:0)
在处理当前令牌后,在循环中调用strtok()
。
while (ch != NULL) {
printf("Valor ch Salida: %s\n", ch);
data[++i] = ch;
ch = strtok(NULL, "_");
}
由于您首先调用了strtok()
,所以您正在跳过第一个令牌,当您到达最后时,您使用空指针调用printf()
。
答案 3 :(得分:0)
试试这个:
int
dataCommand(char *command,char *data[])
{
char *ch;
int i = 0;
while (1) {
ch = strtok(command, "_");
command = NULL;
if (ch == NULL)
break;
data[i++] = ch;
printf("Valor ch Salida: %s\n", ch);
}
printf("dataCommand END\n");
return 0;
}