【问题标题】:expected ‘const char * __restrict__’ but argument is of type ‘int’ with strtok function预期为“const char * __restrict__”,但参数是带有 strtok 函数的“int”类型
【发布时间】:2013-09-24 19:25:17
【问题描述】:
char *local_buffer, *buff;
fgets(buff, 1024, fp);

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

我已经尝试传递一个字符变量而不是'\t',但仍然显示相同的错误。

【问题讨论】:

  • 你试过strtok(buff, "\t")吗?请特别注意双引号而不是单引号。

标签: c


【解决方案1】:

您正在为第二个参数传递一个字符常量(相当于一个整数),而不是一个字符串。

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

你想要的是:

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

【讨论】:

  • 是的。如前所述 here 。单引号指定单个字符,它被解释为一个 int。肯定是那个符号的 ASCII 码。
  • @Kamiccolo '\t' 未指定 ASCII。与任何其他字符 C 兼容的编码一样好。当然 ASCII 是最常见的。
  • @chux 谢谢 :) 我怀疑任何 C 标准处理字符编码。我认为编译器可以。例如,我记得,GCC 有一些标志。 emmmm....关于这个的一些讨论:default encoding for C stringsencoding of C constantsgcc flags for charset control...
【解决方案2】:

试试:

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

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

解释:

字符周围的双引号 ("") 表示以 null 结尾的 C 样式字符串 (char*)

字符周围的单引号('')表示一个字符(显然是int

【讨论】:

  • 一个小问题:虽然字符串文字是只读的,但它们不是const。字符串文字的类型为char[N],其中N 是字符串长度加一。在大多数情况下,它已转换为 char*
  • 建议char buff[1024] 而不是char *buff
  • @KeithThompson:嗯...我以前从未发现过,所以我只是浏览了 C99 文档...所以从技术上讲,字符串文字不是一个常量表达式,但它们在编译器不会捕获到指向字符串文字的指针的翻译时间和修改,而是 UB...有趣...
  • @Chux:很好,我看到了一个错误,就像:“哦!哦!我找到了!” ...我将其归咎于缓存和“复制粘贴”的邪恶。谢谢!
  • @GeorgeMitchell:对。这是为了向后兼容。 Pre-ANSI C 没有const,所以没有办法编写一个接受char* 并承诺不修改其参数指向的函数。可以将字符串文字作为参数的函数:foo("hello")应该将其参数声明为const char*,但强制它(通过使字符串文字const)会破坏前ANSI代码没有使用const 的选项。 (在 C++ 中,字符串字面量是 const,因为不太关心向后兼容性。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多