Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数的隐式声明‘;斯特尔托克’;尽管包括<;字符串.h>;_C_String_Tokenize_Strtok_Gcc Warning - Fatal编程技术网

C 函数的隐式声明‘;斯特尔托克’;尽管包括<;字符串.h>;

C 函数的隐式声明‘;斯特尔托克’;尽管包括<;字符串.h>;,c,string,tokenize,strtok,gcc-warning,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

我有以下代码来标记一个字符串,该字符串包含由
\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;
      }
    }
  }
}
我收到以下警告:

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位桌面上使用GCC4.8.2。

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

    incompatible types when assigning to type 'char[200]' from type 'char *' 
        line = strtok_r(str1, delimiter1, &saveptr1);
             ^
这里,
声明为“char[200]”,但
strtok\u r
返回
char*

integer=…
的第行出现类似错误

为了消除这些编译错误,您可以声明类似于
char*line

有关隐式声明的警告,请选中此项


问题是函数
strtok\u r
返回一个指向char的指针,您正试图将其分配给char数组,因此为了使其工作,您必须将
整数
变量声明为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);
    }
  }
}

void string_to_int_array(char file_contents[BUFFER_SIZE与Debian上的GCC 7.4.2有相同的问题

使用
\uu strtok\u r
-std=gnu99
解决,或在包含后添加原型:

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

#define BUFFER_SIZE 1024

extern char *strtok_r(char *, const char *, char **);
#包括
#包括
#包括
#定义缓冲区大小1024
外部字符*strtok_r(字符*,常量字符*,字符**);

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

通过使用
-std=gnu99
,或通过定义一个扩展来启用扩展,如strtok手册页所示,在包含
string.h
之前支持strtok\u r。例如

#define _GNU_SOURCE
#include <string.h>
定义GNU源
#包括

请注意,代码还有其他问题,
strtok\u r
返回一个
char*
,但您正试图将其分配给
integer=strtok\r(str2、delimiter2和saveptr2)中的字符数组
。您的
整数
变量应该是
char*

整数
以前是
char*
的。我已经改变了假设seg错误是由于分配给char指针造成的,但是改变它没有帮助:您可以尝试将
改为
char*
字符行[200]的ad
。当您使用我在问题中提到的gcc选项编译它们时,
strtok_r
的隐式声明难道您没有收到警告吗?我希望您使用了我在问题中提到的gcc选项,不是吗?您跳过该选项的原因是什么?我将其作为推荐选项的一部分包含在我阅读的文章中在这里编译C程序时。谢谢,您对原因有了深刻的了解,但nos的回答帮助它解决了问题。关于您的隐式声明,
strtok\u r
应该使用
string.h
正确引入,但它是POSIX-2001的一个功能,您应该确保它包含在内。或者
\define\POSIX\u C\u SOURCE>200112L
在包含任何标准头之前,或者通过编译器命令行开关上的
-D
选项提供它。当然,假设您的实现支持它,我当然希望您的实现支持它。@WhozCraig:我没有看到在
的手册页中使用
\define\u POSIX\u C\u SOURCE
trtok_r
,我怎么知道我应该这样做?请参阅中的功能测试宏要求。我假设您在平台上使用glibc。还有其他方法可以吸收它,其中一些可能在设置标准开关时默认预定义(-std=c99可能不会打开它,而-std=c11可能会。我还没有测试过,但我不会感到惊讶。)@WhozCraig:谢谢!你的评论和nos的回答帮助解决了这个问题。非常感谢!)可能重复的问题。请检查此项和此项,谢谢!这是否意味着
strtok\u r
会降低可移植性,并且仅在linux上可用?是的,它可能会降低可移植性。但是strtok\u r是由posix定义的,所以至少几乎所有类似unix的系统都会有它。@i08in
strtok\u r
肯定会降低可移植性,因为它是这是一个*nix-only函数,windows的等价物是
strtok\u
。谢谢,这也很有帮助!
#define _GNU_SOURCE
#include <string.h>