使用strtok函数时,期望的是‘const char * __restrict__’类型的参数,但是实际传入的却是‘int’类型的。

3
char *local_buffer, *buff;
fgets(buff, 1024, fp);

local_buffer=strtok(buff,'\t'); //Error is coming with this line

我已经尝试使用字符变量代替 '\t',但仍显示相同的错误。


你尝试过使用strtok(buff, "\t")吗?请特别注意双引号而不是单引号。 - George Mitchell
2个回答

6

您传递的是单个字符常量(等同于整数),而不是字符串,作为第二个参数。

local_buffer=strtok(buff,'\t');

您实际想要的是:
local_buffer=strtok(buff,"\t");

是的。如此处所述。单引号指定一个单一的字符,被解释为整数。该符号的ASCII码肯定会被考虑在内。 - Kamiccolo
1
@Kamiccolo '\t' 不是指定 ASCII 的。任何其他符合 C 标准的编码字符都可以使用。当然,ASCII 是最常见的。 - chux - Reinstate Monica
@chux 谢谢 :) 我怀疑 C 标准中没有处理字符编码的内容。我认为是编译器处理的。例如,我记得 GCC 有一些相关的标志。嗯...... 关于这个问题有一些讨论:C 字符串的默认编码C 常量的编码gcc 控制字符集的标志... - Kamiccolo

3

尝试:

char *local_buffer, buff[1024];
fgets(buff, 1024, fp);

local_buffer=strtok(buff,"\t"); //Error is coming with this line

说明:

双引号("")表示以null结尾的C风格字符字符串(char*

单引号('')表示字符(显然是int类型)


1
一个小问题:尽管字符串字面值是只读的,但它们不是“const”。字符串字面值的类型为“char[N]”,其中“N”是字符串长度加一。在大多数情况下,它会被转换为“char*”。 - Keith Thompson
建议使用 char buff[1024] 替代 char *buff - chux - Reinstate Monica
@KeithThompson:嗯...我以前从未遇到过这种情况,所以我只是浏览了一下C99文档...因此从技术上讲,字符串字面值不是常量表达式,但它们在编译时被“评估”,并且修改指向字符串字面值的指针不会被编译器捕获,但会导致未定义行为...有趣... - George Mitchell
@Chux:干得好,我看到了一个错误,就像:“哦!哦!我找到了!”...我把它归咎于缓存和“复制粘贴”的邪恶。谢谢! - George Mitchell
@GeorgeMitchell:没错。这是为了向后兼容而设计的。在ANSI C之前,没有“const”,因此无法编写一个函数,该函数接受“char *”并承诺不修改其参数指向的内容。可以将字符串文字作为参数传递的函数:“foo(“hello”)”应该将其参数声明为“const char *”,但强制要求(通过使字符串文字成为“const”)会破坏没有使用“const”选项的ANSI C之前的代码。(在C++中,字符串文字是“const”的,因为对向后兼容性的担忧较少。) - Keith Thompson
@GeorgeMitchell:顺便说一下,问题不在于修改指针,而在于修改指针所指向的内容。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接