为什么printf无法正确显示?

java_lwqx 2009-05-10 05:45:40
//test3
//
#include <vector>
#include <math.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int main()
{
double temp1;
int T;
cin>>T;
T=T*10;
vector<double> vecA;
while(T>0)
{
T--;
cin>>temp1;
vecA.push_back(temp1);
}
vector<double>::iterator iter;
iter=vecA.begin();
while(iter!=vecA.end())
{
double xa=0,ya=0,vax=0,vay=0,Ra=0;
double xb=0,yb=0,vbx=0,vby=0,Rb=0;
xa=*iter++;
ya=*iter++;
vax=*iter++;
vay=*iter++;
Ra=*iter++;

xb=*iter++;
yb=*iter++;
vbx=*iter++;
vby=*iter++;
Rb=*iter++;

double dis2=(xa-xb)*(xa-xb)+(ya-yb)*(ya-yb);
double R2=(Ra+Rb)*(Ra+Rb);

int a=0;
if(dis2==R2)
{
printf("%.3f %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb);
continue;
}


}

return 0;

}


测试数据:
1
100 200 0 0 55
100 100 0 0 45

非常困惑,不知道printf为什么输出不正确,跟踪变量发现xa,ya,xb,yb都不是0,但是输出全是0?
...全文
281 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairchild811 2009-05-10
  • 打赏
  • 举报
回复
up,double是用%lf
lwh_1024 2009-05-10
  • 打赏
  • 举报
回复
7楼是正解
cardinaleaf 2009-05-10
  • 打赏
  • 举报
回复
printf 语句错了啊
printf("%d %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb);
a 是int的
lwh_1024 2009-05-10
  • 打赏
  • 举报
回复
和%f或者%lf无关吧
double型也能够用%f的,gcc和vc中都可以

所以因该是程序的问题了
不知道LZ是在哪里跟踪的?
huqinglu123 2009-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 arong1234 的回复:]
这不是关键,实际上无论它是double还是float,参数传递都会当作double来做(至少在vc6如此)
他关键错误在于a,由于他类型是int,因此传四个字节进栈,但是当printf解析第一个%f时,需要从栈内取出8字节,这导致后面每个数据都是错误的,因为他不在对齐了。

在使用不定参数时,必须确保每个参数类型和期望的类型完全一致,否则就会有严重问题,因为不定参数列表情况无法进行类型的隐式类型转换
看看

http://blog.csd…
[/Quote]

顶七楼.....
liliangbao 2009-05-10
  • 打赏
  • 举报
回复
printf("%.3f %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb); //修改为:
printf("%d %.3lf %.3lf %.3lf %.3lf\n",a,xa,ya,xb,yb); //将整数以浮点数输出是严重的错误~
continue; //去掉没什么意义,因为已经在循环末尾了
wanglc08 2009-05-10
  • 打赏
  • 举报
回复
int a=0;
if(dis2==R2)
{
printf("%.3f %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb); //你上面a 是int,这里应该是%d才对,要么把上面int a改为double a,要么把第一个%.3f改为%d
continue;
}


tonforce 2009-05-10
  • 打赏
  • 举报
回复
顶一楼
言简意赅
arong1234 2009-05-10
  • 打赏
  • 举报
回复
这不是关键,实际上无论它是double还是float,参数传递都会当作double来做(至少在vc6如此)
他关键错误在于a,由于他类型是int,因此传四个字节进栈,但是当printf解析第一个%f时,需要从栈内取出8字节,这导致后面每个数据都是错误的,因为他不在对齐了。

在使用不定参数时,必须确保每个参数类型和期望的类型完全一致,否则就会有严重问题,因为不定参数列表情况无法进行类型的隐式类型转换
看看

http://blog.csdn.net/arong1234/archive/2008/05/18/2456455.aspx
[Quote=引用 6 楼 Loaden 的回复:]
double 对应的 %lf,float 对应的是 %f,查MSDN
[/Quote]
老邓 2009-05-10
  • 打赏
  • 举报
回复
double 对应的 %lf,float 对应的是 %f,查MSDN
ltc_mouse 2009-05-10
  • 打赏
  • 举报
回复
printf无法检测不匹配的类型。
可使用cout,就不用担心这种类型不匹配问题了...
liao05050075 2009-05-10
  • 打赏
  • 举报
回复

int a=0;
if(dis2==R2)
{
printf("%.3f %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb); //你上面a 是int,这里应该是%d才对,要么把上面int a改为double a,要么把第一个%.3f改为%d
continue;
}

morris88 2009-05-10
  • 打赏
  • 举报
回复
试试:
int a=0; 
if(dis2==R2)
{
printf("%d %.3lf %.3lf %.3lf %.3lf\n",a,xa,ya,xb,yb);
continue;
}
  • 打赏
  • 举报
回复
printf("%.3f %.3f %.3f %.3f %.3f\n",a,xa,ya,xb,yb);

double型是%lf啊
fox000002 2009-05-10
  • 打赏
  • 举报
回复
printf 格式控制符号用错了

double 对应的 %lf

float 对应的是 %f

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧