分段错误 - Strtok - Linux C.

时间:2015-10-22 19:52:42

标签: c linux strtok

我对此错误"错误"。该函数将命令与其参数与字符串分开。我正在使用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 []。我不知道还有什么。感谢。

4 个答案:

答案 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;
}