微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以下代码如何运行printf“%c”?

如何解决以下代码如何运行printf“%c”?

我想知道以下程序如何工作?

#include <stdio.h>
int main(void) {
    while(1){
        if(printf("%d",printf("%c")))
        break;
        else
        continue;
    }
    return 0;
}

我不知道部分printf(“%c”)是如何工作的,因此也不知道整个程序。我知道写类似printf(“%c”,'a')的东西;那样,但是不提供要打印的字符怎么办?我的问题是以下程序将打印什么以及如何打印?

我试图运行该程序,有时它什么也没打印,但是有时它却打印了一些随机字符,后跟1。我无法获取它的工作方式,有人可以解释一下代码背后的原因吗?如何打印这些随机字符,以及为什么末尾有一个随机字符?

这是我得到的一些输出

Output

Output

解决方法

欢迎使用未定义行为。对于指定的格式,您没有足够数量的参数,例如

C11 Standard - 7.21.6.1 The fprintf function(p2)如果格式的参数不足,则行为未定义。7.21.6.1(p9)如果转换规范无效,则行为为如果任何参数都不是相应转换规范的正确类型,则行为是不确定的。

,

一个不错的错误程序。

printf("%c")尝试打印应该作为第二个参数的单个字符。但是,由于您从未传递过第二个参数,因此该函数将打印应该具有第二个参数的寄存器中的内容。换句话说,是一些随机字符。但是,它只打印一个字符并返回1:打印的字符数。

该1由printf("%d",printf("%c"))打印。现在您有了一个随机字符,后跟1,并且由于外部printf也打印了一个字符,因此它返回1。

最后,if(printf("%d",printf("%c")))将后一个1解释为true并中断循环。

,

这与格式错误有关。

看这段代码,当执行printf(“%d”,123)时,程序会将数字123压入堆栈,然后压入字符串“%d”,当p​​rintf遇到“%d”时,它将读取该值位于堆栈顶部,因此printf找到数字123。

现在看一下这段代码,printf(“%c”),程序将把字符串“%c”压入堆栈,并尝试读取堆栈顶部的值,而您尚未压入printf的值,因此printf仍会找到值,但该值是随机的,因此您可能会得到一个随机值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。