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'功能呢?