我的代码有问题,我继续收到编译错误:
错误讯息: 警告:赋值从没有强制转换的整数中生成指针
我的代码很简单:
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]);
}
当我修复编译器错误时,我的代码无法打印值,反之亦然!
答案 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
的指针,而arr1
是int
的数组。
要将包含数字的字符串转换为整数,您可以使用strtol
。
如果这不是你想要的,你需要使arr1
成为一个字符串数组,即一个指向char
的指针数组:
char *arr1[8];
一旦你得到程序编译,你也会有一个更严重的错误:数组索引零基于。这意味着数组索引从零到大小减去1,或者在arr1
的情况下,索引从0
到7
(包括)。将数组索引越界将导致undefined behavior。
另一种未定义行为的情况是这一行
printf("result=%s\n",arr1[i]);
在这里你想打印一个字符串,但提供一个整数。如果您将arr1
更改为字符串数组,则此选项不适用。
答案 2 :(得分:0)
编译器警告您将指针指定给int值是错误的。首先因为指针的大小可能比int大。 在你的情况下 - 你需要不指定指针而是指定它引用的值(所以只需使用arr1 [i] = * split1;
但首先检查split1是否为NULL,如果取消引用NULL值,您将获得访问冲突,并且您的应用程序将崩溃。
是的,我建议你注意以前的答案,因为它们包含了很多有用的信息。