"implicit declaration of function 'strtok_s'"


pf = fopen(leggere_filename(partita), "r");
if (pf != NULL)
{
char line[256];
count = 0;
while (fgets(line, sizeof line, pf) != NULL) //read a line
{   
if (count == 8) {
bool turno;
char *end_string;
char *string = strtok_s(line, "", &end_string);
while (string != NULL) {
if (atoi(string) == 1)
turno = true;
else
turno = false;
string = strtok_s(NULL, "", &end_string);
}
partita = scrivereturno(partita, turno);
}

嗨,我需要从文件中取出一个字符串,并通过strtok_s函数分离数字。程序运行正常,但给我带来以下警告信息:

char * string: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int'

:

int strtok_s (): implicit declaration of function 'strtok_s' is invalid in C99.

如何来吗?我很感激你的帮助。

strtok_s定义见C标准附件K。这些所谓的安全函数是可选的,主要在Microsoft系统上可用,但语义与标准的不同。

因此,这些函数是不可移植的,不应该使用。

另一个可能的解释是你没有包括<string.h>。你应该发布一个完整的程序,这样每个可能的解释都可以找到。

您可以使用strtok(),它有几个缺点,但在您的代码中没有问题,或者使用POSIX替代strtok_r(如果您的系统上可用)。

但是请注意,传递一个空字符串作为分隔符字符串是没有意义的。第二个参数应该是带有可能的分隔符的字符串,如' ''t''n'用于空格或显式分隔符,如','

Microsoft文档指定了这个原型:

char* strtok_s(
char* str,
const char* delimiters,
char** context
);

然而C标准有这个:

#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
char *strtok_s(char * restrict s1,
rsize_t * restrict s1max,
const char * restrict s2,
char ** restrict ptr);

甚至原型都是不同且不兼容的。不要使用这个函数.

POSIX函数strtok_r,strtok的可重入版本有这样的原型:

char *strtok_r(char *restrict str, const char *restrict delim,
char **restrict saveptr);

与Microsoft版本的strtok_s'兼容。一种更可移植的方法是使用strtok_r并添加这些行以在Windows上兼容:

#ifdef _MSC_VER
#define strtok_r(s,d,c)  strtok_s(s,d,c)
#endif

关于附录K函数的更完整的讨论,参见这个问题:

你使用TR 24731 'safe'功能呢?

最新更新