语言C strtok有一些错误

时间:2014-04-17 10:18:26

标签: c strtok

我的代码有问题,我继续收到编译错误:

  

错误讯息:   警告:赋值从没有强制转换的整数中生成指针

我的代码很简单:

int i;
int arr1[8], arr2[8];
char test[] = "1|a|b;2|c|d;3|e|f";
char *split1, *split2;

split1 = strtok(test, ";");
for(i = 1; i <= 8; i++){
  arr1[i] = split1;
  split1 = strtok(NULL, ";");
  printf("result=%s\n", arr1[i]);
}

当我修复编译器错误时,我的代码无法打印值,反之亦然!

3 个答案:

答案 0 :(得分:3)

  

错误消息:警告:赋值从没有强制转换的整数生成指针

您需要为编译器包含适当的原型,以了解函数返回的类型(或假设它们返回int)。

strtok()的原型位于<string.h>

#include <string.h>

    split1=strtok(NULL,";"); // without a prototype
                             // the compiler assumes strtok() returns an int
                             // and complains about assigning the int to a pointer

答案 1 :(得分:1)

除了问题中提到的错误之外,您还有很多其他错误。例如:

arr1[i]=split1;

变量split1字符串,指向char的指针,而arr1int的数组。

要将包含数字的字符串转换为整数,您可以使用strtol

如果这不是你想要的,你需要使arr1成为一个字符串数组,即一个指向char的指针数组:

char *arr1[8];

一旦你得到程序编译,你也会有一个更严重的错误:数组索引零基于。这意味着数组索引从零到大小减去1,或者在arr1的情况下,索引从07(包括)。将数组索引越界将导致undefined behavior

另一种未定义行为的情况是这一行

printf("result=%s\n",arr1[i]);

在这里你想打印一个字符串,但提供一个整数。如果您将arr1更改为字符串数组,则此选项不适用。

答案 2 :(得分:0)

编译器警告您将指针指定给int值是错误的。首先因为指针的大小可能比int大。 在你的情况下 - 你需要不指定指针而是指定它引用的值(所以只需使用arr1 [i] = * split1;

但首先检查split1是否为NULL,如果取消引用NULL值,您将获得访问冲突,并且您的应用程序将崩溃。

是的,我建议你注意以前的答案,因为它们包含了很多有用的信息。