【问题标题】:Printf not replacing format string parametersPrintf 不替换格式字符串参数
【发布时间】:2011-04-04 02:24:01
【问题描述】:

我正在尝试做一项家庭作业,涉及修改 minix 中的一些内核代码,但遇到了我见过的最奇怪的问题。

我正在修改 pm 服务器上的 alloc.c(对于那些熟悉 minix 的人),并且我在文件顶部添加了一个全局变量:

PUBLIC int logging = 0;

然后我试图在我添加到内核的一个函数中读取变量:

PUBLIC int do_setalloc(void)
{
  printf("logging = %i\n", logging");
  return (OK);
}

然后我有一个在内核空间之外运行此代码的测试程序:

int main(void)
{
  message m;
  m.m1_i1 = 1;
  m.m1_i2 = 1;
  _syscall(MM,69,&m);
  return 0;
}

这是这段代码运行时的输出:

logging = %i

Printf 实际上并没有用整数的实际值替换 %i 格式,我在这里扯掉了我的头发,这个任务很快就要到期了!救命!

【问题讨论】:

  • +1 用于发现丑陋的 Minix 错误。 :-)

标签: c printf minix


【解决方案1】:

我认为“%i”不是有效的格式转换;最常用的打印 int 的标签是“%d”。但是我刚刚看到的 printf 手册页声称 %i 是 %d 的同义词。也许 minix printf 没有定义它。

【讨论】:

  • 可能应该只是一个评论:)
  • 确实,尽管显然,基于 OP 其他地方的 cmets,这确实是问题所在——他的 minix printf 实现不使用“%i”。
  • %i 存在的原因是为了与scanf 格式对齐。虽然%i%dprintf 相同,但scanf 前者支持十六进制和八进制,如C 整数常量,而后者只支持十进制。
【解决方案2】:

printf中的整数不就是%d吗?

【讨论】:

  • 两者:d, i The int argument is converted to signed decimal notation.
  • %i 是同义词(%d - 以 10 为底的十进制,%i - 以 10 为底的整数)。
  • 哇,你说得对。谢谢! Aparrantly %i 在 C++ 中工作,但不是 C,这解释了很多(我正在做一些测试试图帮助我弄清楚,但我使用的是 C++ 编译器,所以它正在工作,但不是在我的实际内核中三)
  • @Ring,请注意%i 在用户空间中 可以正常工作,但 Minix Kernel 开发团队一定因为某种原因决定不支持两者。不要将此归咎于 C。:)
  • 是的,我以为我会把它扔在那里,但由于一些我不知道的 Minix 事情,我正在等待反对票。
猜你喜欢
  • 1970-01-01
  • 2015-12-15
  • 2017-08-04
  • 2023-04-06
  • 2015-01-21
  • 2015-11-14
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多