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的系统都会有它。@i08instrtok\u r
肯定会降低可移植性,因为它是这是一个*nix-only函数,windows的等价物是strtok\u
。谢谢,这也很有帮助!
#define _GNU_SOURCE
#include <string.h>