在C中输出嵌套的printf和scanf

时间:2013-03-21 20:20:15

标签: c printf scanf

请帮我解决这个程序的输出。为什么显示结果 o / p PRINT 2 8输入3 4
我认为输出可能因机器而异,但是如何实现。

#include<stdio.h>
int main() {
    int i,a;
    printf("%d",printf("PRINT %d\t",scanf("%d%d,",&i,&a)));  
    return 1;
}

3 个答案:

答案 0 :(得分:1)

printf()立即执行输出。它不会“返回”您刚刚打印的字符串。它返回输出的字符数(您的7)。如果您希望将内部打印件送入外部打印件,则需要使用sprintf()代替。 “String printf”。

答案 1 :(得分:0)

任何好的C引用,例如Linux printfscanf手册页,都会记录标准函数的返回值,这些函数将解释打印时会看到的内容。他们的回报值。

在此特定情况下,scanf的返回值是成功匹配的输入项的数量。每个“输入项”对应%字符串中的scanf模式,因此在这种情况下,如果scanf具有两个模式的有效输入,则它将返回2。然后,printf返回它输出的字符数。 (在这种情况下,报告的输出是令人惊讶的,因为我期望8:strlen("PRINT ") == 6,加上scanf返回的一个字符加上标签的一个字符。)

我认为没有理由为什么这些值中的任何一个会在系统之间发生变化,当然如果scanf无法匹配其输入项,它会发生变化。

答案 2 :(得分:0)

我认为你缺少的是,你的一行嵌套函数调用与这段代码基本相同:

int scanf_result = scanf("%d%d,",&i,&a);
int printf_result = printf("PRINT %d\t", scanf_result));
printf("%d", printf_result);
如果您输入了有效输入,则

scanf调用应返回2,但如果实际错误也可返回-1,如果无法扫描2个整数,则返回0或1。然后按照您的预期,首先按printf打印,然后返回8(如果scanf返回-1,则返回9),这样7可能意味着您实际执行的代码之间存在差异,和你粘贴的代码......然后第二个printf在同一行打印这个数字(在任何地方都没有打印换行符),为你提供最终输出。

没有歧义,编译器不能在此处以不同的顺序执行操作。将函数的返回值作为参数传递给另一个函数时,必须首先调用第一个函数,以获取返回值。所以任何&#34;副作用&#34;例如从标准输入读取或打印到标准输出也按此顺序发生。

你可以获得不公正的方法是在同一个参数列表中的相同变量上多次使用赋值运算符或++--运算符。然后,当变量值实际更改时,它是未定义的,因此当您在同一个参数列表中多次使用同一个变量时,会传递哪些值。