函数'strtok_r'的隐式声明[-Wimplicit-function-declaration]尽管包括<string.h> </string.h>

时间:2014-05-30 18:27:09

标签: c string tokenize strtok gcc-warning

我有以下代码来标记包含由\n分隔的行的字符串,每行包含由\t分隔的整数:

void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) {
  char *saveptr1, *saveptr2;
  char *str1, *str2;
  char delimiter1[2] = "\n";
  char delimiter2[2] = " ";
  char line[200];
  char integer[200];
  int j;
  for(j = 1, str1 = file_contents; ; j++, str1 = NULL) {
    line = strtok_r(str1, delimiter1, &saveptr1);

    if (line == NULL) {
      break;
    }


    for (str2 = line; ; str2 = NULL) {
      integer = strtok_r(str2, delimiter2, &saveptr2);
      if (integer == NULL) {
        break;
      }
    }
  }
}

(此处仅包含相关功能,如果需要,则为here完整。)

但是,当我尝试使用以下代码编译此代码时:

gcc -m64 -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes file_read.c

我收到以下警告:

file_read.c:49:5: warning: implicit declaration of function ‘strtok_r’ [-Wimplicit-function-declaration]
     line = strtok_r(str1, delimiter1, &saveptr1);
     ^
file_read.c:49:10: error: incompatible types when assigning to type ‘char[200]’ from type ‘int’
     line = strtok_r(str1, delimiter1, &saveptr1);
          ^
file_read.c:59:15: error: incompatible types when assigning to type ‘char[200]’ from type ‘int’
       integer = strtok_r(str2, delimiter2, &saveptr2);
               ^

第49和59行对应于strtok_r来电。

正如您所看到的,我已将string.h包含在我的文件中(这是声明strtok_r的地方),我仍然收到strtok_r的隐式声明警告。

有关如何删除警告的任何见解都表示赞赏。

我在ubuntu 14.04 64位桌面上使用gcc 4.8.2。

4 个答案:

答案 0 :(得分:8)

strtok_r不是标准的C函数。您只使用-std=c99编译器标志要求C99,因此(glibc)头文件只能使string.h中的标准C99函数可用。

使用-std=gnu99启用扩展,或者在包含string.h之前定义支持strtok_r的strtok联机帮助页中显示的扩展之一。 E.g。

#define _GNU_SOURCE
#include <string.h>

请注意,代码也存在其他问题,strtok_r会返回char *,但您尝试将其分配给integer = strtok_r(str2, delimiter2, &saveptr2);中的char数组。您的integer变量应为char *

答案 1 :(得分:2)

与Debian上的GCC 7.4.2相同的问题

使用__strtok_r-std=gnu99解决或在包含以下内容后添加原型:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 1024

extern char *strtok_r(char *, const char *, char **);

答案 2 :(得分:1)

我也使用4.8.2和ubuntu 14.04 64位。但我得到了不同的错误。

    incompatible types when assigning to type 'char[200]' from type 'char *' 
        line = strtok_r(str1, delimiter1, &saveptr1);
             ^

此处,line被声明为&#39; char [200]&#39;但是strtok_r会返回char*

integer = ...行的类似错误。

要摆脱这些编译错误,您可以声明char *line;

之类的内容

有关隐式声明的警告,请检查此

Can I use strtok() in a Linux Kernel Module?

答案 3 :(得分:1)

问题是函数strtok_r返回一个指向char的指针,你试图分配给一个char数组,所以为了使它工作,你必须声明你的lineinteger变量作为char的指针,然后用malloc分配内存。

void string_to_int_array(char file_contents[BUFFER_SIZE << 5], int array[200][51]) {
  char *saveptr1, *saveptr2;

  char *str1, *str2;

  char delimiter1[2] = "\n";
  char delimiter2[] = " ";
  char *line;
  char *integer;
  int j;
  line = (char*)malloc(200);
  integer = (char*)malloc(200);
  for(j = 1, str1 = file_contents; ; j++, str1 = NULL) {
    line = strtok_r(str1, delimiter1, &saveptr1);
    printf("%s\n", line);
    if (line == NULL) {
      break;
    }
    printf("end of first\n");

    for (str2 = line; ; str2 = NULL) {
    printf("begin of second\n");
      printf("asdf%s\n", line);
      integer = strtok_r(str2, delimiter2, &saveptr2);
      if (integer == NULL) {
        break;
      }
      printf("%s\n", integer);
    }
  }
}