c - printf 语句中 % 符号在以下情况下的作用

标签 c printf

我无法理解以下两种情况的输出。 编译器:Windows 上的 Borland C++ 5.02 案例一:

#include <stdio.h>

int main()
{
    char str[] = "HELLO";
    printf("%abc %2s", str, str);
    return 0;
}
output:%abc %2s

案例2:

#include <stdio.h>

int main()
{
    char str[] = "HELLO";
    printf("abc %2s", str, str);  //% sign removed
    return 0;
}
output:abc 1310540

请让我理解输出。如果这听起来很幼稚,请原谅。我在 C 语言中有点天真。

最佳答案

这是我的猜测:

printf("%abc %2s", str, str);

您古老的编译器早于引入 %a 格式字符串。因此,运行时意识到它遇到了它无法识别的格式字符串,并放弃尝试格式化。无论如何,您都不能将字符串传递给 %a 并期望得到任何有意义的内容。因此,即使您的编译器理解“%a”,该行为也将是未定义的。试图理解 UB 并没有什么收获。修复您的代码。

printf("abc %2s", str, str);

应该输出

abc HELLO

即使在古老的编译器上也是如此。如果没有,那就是编译器运行时的错误。

我个人准备打赌您的编译器将为该程序生成该输出。我宁愿认为你的问题被错误地转录。问题中的输出与代码不匹配,反之亦然。

这已由您的 Pastebin 确认:

#include<stdio.h>

int main()
{
  char str[] = "HELLO";
    printf("abc %d", str, str);//different from code in question

    return 0;
}

Output: abc -1083086374

因此,不仅讨论 UB 有点毫无意义,而且当您运行的版本与问题中的代码不同时讨论程序就更没有意义了。将来我强烈建议您使用复制/粘贴将代码传输到 Stack Overflow 问题中,并仔细检查输出是否与您声称的相符。

底线:现在是 2013 年了。没有理由使用 BCC v5.02。是时候及时上前了。

关于c - printf 语句中 % 符号在以下情况下的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222575/

相关文章:

for 循环中 pow() 的编译器错误

c 格式字符串 : printf argument containing format specifiers

c - 数组 ptr 的地址等于它的值?

c - printf@plt 和 puts@plt 的区别

c - 在 ubuntu 12.04 上制作 openwsman 时出错

c - sprintf_s(以及 sprintf )在使用 Visual Studio 2013 的 Windows 7 64 位中出现错误

c++ - 带有时间戳的自定义打印功能给出警告

无法使定义的数字起作用

c - 链表代码中的插入操作不起作用

c - 尝试对 TPIC6C595 移位寄存器进行位操作但没有输出