C语言中程序中scanf()和printf()的功能机制[复制]

functioning mechanism of scanf() and printf() inside the programme in C [duplicate]

提问人:Gyanaranjan Behera 提问时间:10/25/2023 最后编辑:Ted LyngmoGyanaranjan Behera 更新时间:10/25/2023 访问量:79

问:

我曾经使用 scanf() 和 printf() 编写 c 编程,并且在我更改它们内部的编写格式并试图了解我编写的编程输出的原因时遇到了一些问题。我已经写了下面我写的代码,并写了我在该程序下的每个程序中遇到的问题。尝试回答每个问题并解释它......

#include<stdio.h>
int main() {
    int a; 
    float b;
    scanf("%d", &a);
    scanf("%f", &b);
    printf("a is %d\n", a);
    printf("b is %f\n", b);
    return 0;
}

对于此代码,输出正常

但对于以下代码:-

#include<stdio.h>
int main() {
    int a;
    float b;
    scanf("%d");
    scanf("%f");
    printf("a is %d\n", a);
    printf("b is %f\n", b);
    return 0;
 }

如上所述,代码说输入中的整数值,当我们在输入中给出任何整数值时,然后在输入值后,程序结束,第二个和不执行。如果我输入任何其他类型的数据,例如,如果我输入任何字符作为第一个输入,然后在输入值后执行,并且 A 和 B 打印有垃圾值,但不会调用。scanf()scanf()printf()scanf()printf()scanf()

#include<stdio.h> 
int main() {
    int a;
    float b;
    scanf("%d");
    scanf("%f");
    printf("a is %d\n", a);
    printf("b is %f\n", b);
    return 0; 
}  

对于这段代码,我遇到了与我在第二个代码中遇到的问题相同的问题。

#include<stdio.h>
int main() {
    int a;
    float b;
    scanf("%d");
    scanf("%f");
    printf("a is %d\n");
    printf("b is %f\n");
    return 0;
}

但是在此代码中,所有 和 都执行了,我们在输入中输入适当的值作为每个值的需要,但是如果我们输入另一种数据类型的任何不同值,例如如果我们在输入中输入任何字符并按回车键,程序将以调用所有并打印 a 和 b 的垃圾值结束。如果我们输入字符作为第一个的输入,那么程序将从第一个结束,所有都被调用,但第二个不被调用。scanf()printf()scanf()scanf()printf()scanf()scanf()printf()scanf()

#include<stdio.h>
int main() {
    int a;
    float b;
    scanf("%d",&a);
    scanf("%f");
    printf("a is %d\n",a);
    printf("b is %f\n",b);   
    return 0;
}     

all 和 在上述代码的输出中被调用。 如果我们输入合适的值作为输入,那么所有值都将被执行,但 A 和 B 的输出将打印出垃圾值,但是如果我们输入一个合适的值作为第一个值的输入,并且如果我们输入任何不同的值,例如如果我们输入任何字符作为第二个输入,那么只有 A 打印用户输入的实际值,而 B 打印垃圾值。scanf()printf()scanf()scanf()scanf()

c printf 扫描

评论

4赞 Retired Ninja 10/25/2023
不传递参数来匹配格式字符串,无论您想出多少个不同的版本,都是不正确的。scanf
4赞 Ingo Leonhardt 10/25/2023
在示例 2-5 中,所有没有适当参数的调用都会调用未定义的行为,因此这些程序中可能会发生任何事情scanf()
0赞 Gyanaranjan Behera 10/25/2023
但这些输出背后的原因应该是什么
4赞 Ted Lyngmo 10/25/2023
未定义的行为意味着它几乎可以输出任何内容或不输出任何内容。
2赞 John Bollinger 10/25/2023
就语言规范而言,没有理由。这就是“未定义”的含义。如果您可以访问实现的标准库的源代码,那么毫无疑问,可以追踪出产生这些结果的确切机制,但这是一种好奇心,而不是任何特定意义的问题。而且,即使您告诉我们您正在使用什么实现,您也不太可能在这里得到答案。

答:

2赞 0___________ #1
    scanf("%d");
    scanf("%f");

不传递必需的参数会调用未定义的行为 UB。任何事情都可能发生,关于程序为什么以特定方式运行的考虑是没有意义的。