大家好,我在编译c源文件的make命令时遇到了以下问题
vinmodule.c: In function ‘vin_routing’:
vinmodule.c:15: error: comparison between pointer and zero character constant [-Werror=pointer-compare]
while(tmp_str!='\0') {
^~
vinmodule.c:8: note: did you mean to dereference the pointer?
while(tmp_str!='\0') {
^
cc1: all warnings being treated as errors
字符串
这里如果用debian 9 os编译相同的源代码,它可以工作,但是对于上面的操作系统版本得到上面的错误。我可以知道什么是错误的,它像c编译器版本的操作系统吗?
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int
main ()
{
char *mydata = NULL;
char *tmp_str = NULL;
char *string_sep = ":::";
int k;
char *number = NULL;
char *type = NULL;
mydata = "1234567890:::TEST";
k = 0;
tmp_str = strtok (mydata, string_sep);
while (tmp_str != '\0')
{
if (k == 0)
{
number = strdup (tmp_str);
}
else if (k == 1)
{
type = strdup (tmp_str);
}
tmp_str = strtok (NULL, string_sep);
k++;
}
}
型
1条答案
按热度按时间z3yyvxxp1#
程序有缺陷,当您使用
-Werror
时,任何警告都会导致构建失败。1.首选初始化变量而不是单独赋值。
1.最小化变量的作用域。
1.当迭代一个带有索引变量的数组时,更喜欢
for
而不是while
-循环。甚至,像这里一样,你需要在中间终止循环。tmp_str != '\0'
将指针与整数文字进行比较。使用if(tmp_str != NULL)
或如下的if(!tmp_str)
。strtok()
修改它的输入,所以输入字符串mydata
需要是可写的,即char []
而不是char *
,否则你会有未定义的行为(可能是一个segfault)。1.考虑在一个地方调用
strtok()
,第一个参数是有条件的,这样可以减少代码重复。1.对于给定的输入,你可以简化逻辑(k或!k;这是个问题),或者更进一步,只使用
strstr()
来定位分隔符并导航到之前或之后的字段。字符串
下面是一个使用
strstr()
的简化版本,它不会修改它的输入:型
示例输出:
型