无法使用make命令编译c

oknwwptz  于 2024-01-06  发布在  其他
关注(0)|答案(1)|浏览(143)

大家好,我在编译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++;
    }
}

z3yyvxxp

z3yyvxxp1#

程序有缺陷,当您使用-Werror时,任何警告都会导致构建失败。
1.首选初始化变量而不是单独赋值。
1.最小化变量的作用域。
1.当迭代一个带有索引变量的数组时,更喜欢for而不是while-循环。甚至,像这里一样,你需要在中间终止循环。

  1. tmp_str != '\0'将指针与整数文字进行比较。使用if(tmp_str != NULL)或如下的if(!tmp_str)
  2. strtok()修改它的输入,所以输入字符串mydata需要是可写的,即char []而不是char *,否则你会有未定义的行为(可能是一个segfault)。
    1.考虑在一个地方调用strtok(),第一个参数是有条件的,这样可以减少代码重复。
    1.对于给定的输入,你可以简化逻辑(k或!k;这是个问题),或者更进一步,只使用strstr()来定位分隔符并导航到之前或之后的字段。
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// strtok searches for a set of bytes (not a string) and
// skips empty tokens so k=1 will be the TEST token.
#define SEP ":"

int main(void) {
    char mydata[] = "1234567890:::TEST";
    char *number = NULL;
    char *type = NULL;
    for(int k = 0;; k++) {
        char *tmp_str = strtok(k ? NULL : mydata, SEP);
        if(!tmp_str)
            break;
        if(k)
            type = strdup(tmp_str);
        else
            number = strdup(tmp_str);
    }
    if(number && type)
       printf("number = %s, type = %s\n", number, type);
    free(number);
    free(type);
}

字符串
下面是一个使用strstr()的简化版本,它不会修改它的输入:

#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SEP ":::"

int main(void) {
    const char *mydata = "1234567890:::TEST";
    char *sep = strstr(mydata, SEP);
    char *number = NULL;
    char *type = NULL;
    if(sep) {
        number = strndup(mydata, sep - mydata);
        type = strdup(sep + sizeof(SEP) - 1);
        printf("number = %s, type = %s\n", number, type);
    }
    free(number);
    free(type);
}


示例输出:

number = 1234567890, type = TEST

相关问题