我有以下代码来标记包含由\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.0464位桌面上使用gcc 4.8.2。

最佳答案

strtok_r不是标准的c函数。通过使用-std=c99编译器标志,您只需要c99,因此(glibc的)头文件只会使string.h中的标准c99函数对您可用。
通过使用-std=gnu99启用扩展,或者通过定义strtok手册页中显示的扩展之一(在包含string.h之前支持strtok\u r)来启用扩展。例如。

#define _GNU_SOURCE
#include <string.h>

注意,代码也有其他问题,strtok_r返回一个char *,但是您试图将其分配给integer = strtok_r(str2, delimiter2, &saveptr2);中的一个char数组。您的integer变量应该是char *

07-28 03:04
查看更多