【问题标题】:Format-Specifiers Syntax Error?格式说明符语法错误?
【发布时间】:2014-03-12 23:38:57
【问题描述】:

我在使用 printf 说明符时遇到了一点麻烦……所以在问你们之前,我几乎阅读了C++Reference page 上的所有内容,但无法解决问题,而且由于我是 c 的新手,我什至无法理解这个问题,这是最可能是语法错误,但我找不到它...

for(i = 1; i <= 10; i++) {  
    printf("\n%d.%s%n",i,names[i-1],offset);
    printf("%*s%.2f TL",10-offset," ",prices[i-1]);
}

所以基本上我有这个代码来打印一个列表,我希望价格从同一列开始。 例如:

  1. 水 1.00
  2. oj 1.00

我的代码背后的逻辑(如果不明显,我不知道是不是)是:

  • 打印 id 编号和名称,计算到目前为止我们写了多少个字符并将其分配给偏移量。
  • 打印(价格表的起始列)-价格前的偏移空间

一旦我无法得到我想要的结果,我检查并发现所有名称的偏移量都是 3,但情况并非如此(并且在此过程之前没有为偏移量分配值)。

感谢您的任何帮助!

PS:这是一个练习代码,只是为了更好地有效地使用说明符。

编辑: 所以我这样做了:

for(i=1;i<=10;i++)

{

printf("%d.%s%n",i,names[i-1],&offset);
printf("%*s%.2f TL\n",10-offset," ",prices[i-1]);

}

但我得到的结果是巨大的空白黑色命令屏幕。

【问题讨论】:

  • printf 是 C,首选构造是 C++ 中的 cout &lt;&lt; ...;
  • 我很困惑,是的,我正在研究 c,但由于 c++ 参考页面上有 c++ 参考指南,我认为可以在这里问它
  • @user3402183 肯定是。 printf 是完全有效的 C++。它在标准头文件 中,参见。 27.9.2 标准草案。
  • URW。顺便说一句,我不知道 %* 并且忘记了 %n。学到了一些东西:-)
  • 嗯,一个巨大的黑色命令屏幕......所以我们处于软件开发过程的第 4 阶段(不编译 - 编译但不链接 - 编译,链接,但崩溃-- 编译、链接、运行,但不执行我想要的操作)。当我运行它时,您的代码打印得很好(并且是表格!),所以现在出现巨大黑屏的原因在其他地方。尝试在 main 中打印一些静态的第一件事......在循环中打印一些调试输出......类似的东西。

标签: printf format-specifiers


【解决方案1】:

%n 格式说明符需要一个指针。您的代码缺少用于偏移的 & 运算符:

printf("\n%d.%s%n",i,names[i-1],&offset);

良好的 ol' C 接口不知道您提供给 printf 的类型,因此它不会抱怨并愉快地读取堆栈上偏移量的 4 字节整数值作为内存位置 -> 核心转储。

实际上,带有 -Wall 的 g++ 确实会发出警告。所以

  • hd1 有一个重点,因为 C++ 输出是类型安全的(尽管这很痛苦);
  • 注意你的警告。

【讨论】:

  • 显然我无法回答我自己的问题,所以为了通知你我已经尝试了解决方案但仍然失败,我留下了这个评论。(编辑了问题)
【解决方案2】:

当您以printf 格式使用%n 时,对应的参数必须是指针。 printf 会将信息存储在您指向的int 中。

假设您在某处声明了int offset,您应该使用&amp;offset 作为printf 调用中的最后一个参数。

当我们在这里时,请允许我对这段摘录发表评论:

printf("\n

啊不!换行符是一个终止符。它位于一行的末尾,而不是开头。

【讨论】:

  • 感谢您提供的信息,我立即修复了它! ^^
【解决方案3】:

所以我这样做了:

for(i=1;i<=10;i++)

{

printf("%d.%s%n",i,names[i-1],&offset);
printf("%*s%.2f TL\n",10-offset," ",prices[i-1]);

}

但我得到的结果是巨大的空白黑色命令屏幕。

编辑:你们可以试试这个并告诉我你是否得到正常的结果?我无法理解发生的错误,所以我无法克服它......也许其他一些例子会引导我发现错误在哪里。

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2017-11-12
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2013-08-28
    相关资源
    最近更新 更多