C printf的行为不像我想象的那样

C printf的行为不像我想象的那样,c,C,如果我运行下面的代码,它将不会显示整个答案last printf是答案。我想知道为什么它没有显示整个答案。有人知道这个问题吗 #include <stdio.h> int main() { int M,T,P,K,H; printf("Teekonna pikkus:\n"); scanf("%u", &P); printf("Tarbitud k\u00FCtuse kogus:\n"); scanf("%u", &K);

如果我运行下面的代码,它将不会显示整个答案last printf是答案。我想知道为什么它没有显示整个答案。有人知道这个问题吗

#include <stdio.h>

int main()
{
    int M,T,P,K,H;
    printf("Teekonna pikkus:\n");
    scanf("%u", &P);
    printf("Tarbitud k\u00FCtuse kogus:\n");
    scanf("%u", &K);
    printf("K\u00FCtuse liitri hind:\n");
    scanf("%u", &H);
    T = K/(P/100);
    M = K*H;
    printf("Olete s\u00F5itnud %u", P," kilomeetrit ning kulutanud %u", K," liitrit kütust. Teie auto k\u00FCtusekulu oli %u", T," liitrit 100 kilomeetri kohta. S\u00F5idu maksumus oli %u", M," eurot.");
    while(1);
}
printf不是这样工作的。将所有参数放在格式字符串之后

printf("Olete s\u00F5itnud %u kilomeetrit ning kulutanud %u liitrit kütust. Teie auto k\u00FCtusekulu oli %u liitrit 100 kilomeetri kohta. S\u00F5idu maksumus oli %u" eurot.", P, K, T, M);
printf不是这样工作的。将所有参数放在格式字符串之后

printf("Olete s\u00F5itnud %u kilomeetrit ning kulutanud %u liitrit kütust. Teie auto k\u00FCtusekulu oli %u liitrit 100 kilomeetri kohta. S\u00F5idu maksumus oli %u" eurot.", P, K, T, M);
输出基于第一个字符串参数格式化字符串,将其中的特殊%字符格式化说明符替换为字符串后面的其他参数

因此,它只显示您要求显示的内容,因为您只有%u个unsigned int,对应于p。其余参数将被忽略,因为在格式化字符串中找不到其他格式化说明符

您应该连接所有格式字符串:

  printf (""Olete s\u00F5itnud %u  kilomeetrit ning kulutanud %u ...%u...%u...", P, K, T, M); 
输出基于第一个字符串参数格式化字符串,将其中的特殊%字符格式化说明符替换为字符串后面的其他参数

因此,它只显示您要求显示的内容,因为您只有%u个unsigned int,对应于p。其余参数将被忽略,因为在格式化字符串中找不到其他格式化说明符

您应该连接所有格式字符串:

  printf (""Olete s\u00F5itnud %u  kilomeetrit ning kulutanud %u ...%u...%u...", P, K, T, M); 

printf具有以下语法:

int printf ( const char * format, ... );
第一个参数是格式,所有其他变量都可以替换格式中的占位符

你应该写:

printf("Olete s\u00F5itnud %u kilomeetrit ning kulutanud %u liitrit kütust. Teie auto k\u00FCtusekulu oli %u liitrit 100 kilomeetri kohta. S\u00F5idu maksumus oli %u eurot.", P, K, T, M);

printf具有以下语法:

int printf ( const char * format, ... );
第一个参数是格式,所有其他变量都可以替换格式中的占位符

你应该写:

printf("Olete s\u00F5itnud %u kilomeetrit ning kulutanud %u liitrit kütust. Teie auto k\u00FCtusekulu oli %u liitrit 100 kilomeetri kohta. S\u00F5idu maksumus oli %u eurot.", P, K, T, M);

代码中有两个问题:

printf应该用作:printfP:%d-T:%d\n,p,T

但也存在被零除的可能性:

T=K/p/100

p是一个整数,如果p/100足够小,它将四舍五入为0。那么K/0零将产生一个问题


因此,在除法之前应该检查这些值。对于某些变量,最好使用或转换为float或double。

代码中有两个问题:

printf应该用作:printfP:%d-T:%d\n,p,T

但也存在被零除的可能性:

T=K/p/100

p是一个整数,如果p/100足够小,它将四舍五入为0。那么K/0零将产生一个问题


因此,在除法之前应该检查这些值。对于某些变量,最好使用或转换为float或double。

为什么在程序末尾有一个while1?首先,查找printf语法。然后printf可能没有将字符串刷新到stdout,请尝试在格式字符串的末尾添加\n,或添加fflushstdout;在printf语句之后。另外,从技术上讲,您的程序有未定义的行为,因为您有一个无限循环。@Praetorian while1可能是为了不丢失控制台窗口。当然,一个getch或scanf会更好。@kapanoglu你是对的,它就是为此而写的:为什么你在程序的末尾有一个while1?首先,查找printf语法。然后printf可能没有将字符串刷新到stdout,请尝试在格式字符串的末尾添加\n,或添加fflushstdout;在printf语句之后。另外,从技术上讲,您的程序有未定义的行为,因为您有一个无限循环。@Praetorian while1可能是为了不丢失控制台窗口。当然,一个getch或scanf会更好。@kapanoglu你是对的,它就是为此而写的:T=K/P/100;实际上是我的老师建议的,所以应该不会有任何问题,但是谢谢你提供的信息:@MihkelKull-你可以确定这是个问题:-你真的应该检查这些值,甚至可以使用浮点值。尝试使用PT=K/P/100;实际上是我的老师建议的,所以应该不会有任何问题,但是谢谢你提供的信息:@MihkelKull-你可以确定这是个问题:-你真的应该检查这些值,甚至可以使用浮点值。顺便说一句,使用PFirstly是一个非常糟糕的API,原因很多。第二,这个问题被贴上了标签,而不是。即使在C++中,流行的事实也会说很多,即使在C++中,它也绝对不是遗留的,更不用说在C!!提姆很抱歉,但在我回答时,它被标记为C++。关于在C++中使用printf与streams:您可能对此有自己的看法。只是printf不像streams那样支持面向对象。现在有了一个C标记,这就不再是一个问题了。顺便说一句,这是一个非常糟糕的API,原因有很多。第二,这个问题被贴上了标签,而不是。即使在C++中,流行的事实也会说很多,即使在C++中,它也绝对不是遗留的,更不用说在C!!提姆很抱歉,但在我回答时,它被标记为C++。关于使用printf与st C++中的reams:你可能对此有自己的看法。只是printf不像streams那样支持面向对象。现在使用C标记,这不再是一个问题