作者Scofield ( 2pac )
看板C_and_CPP
标题Re: [问题] printf输出的问题
时间Tue Mar 24 04:54:10 2009
这是不定长度引数(Variable-length argument)取出错误造成的问题
首先看一下printf的原型式 int printf(const char *format, ...)
『...』就是不定长度引数
这要靠va_list(type)以及va_start, va_arg, va_end这三个巨集(macro)实作
而printf中『...』里面有什麽东西要靠va_arg指定才可以取得
例如
va_list arg_ptr; //宣告不定长度引数
double d = va_arg(arg_ptr, double);
或
int i = va_arg(arg_ptr, int);
每次执行va_arg的时候就会根据读取的型态长度向後位移 这有点像是读取档案的情形
而double float int的位元长度是不一样的
因此你写下printf("a=%d,b=%d,c=%f\n",5,5.1,5.2);的时候
printf根本不知道後面不定长度引数里面有什麽东西
只能靠前面的%d %f决定要怎麽读取不定长度引数的内容
当读取第二个引数时发生错误 後面的也跟着会乱掉
这样说不知道你有没有懂?
※ 引述《foxc ( )》之铭言:
: 不好意思 小弟有问题想请教
: 环境为 WinXP, Dev-C++ 4.9.9.2
: Source code 如下
: #include<stdio.h>
: #include<stdlib.h>
: int main(void)
: {
: printf("a=%d,b=%f,c=%f\n",5,5.1,5.2);
: printf("a=%d,b=%d,c=%f\n",5,5.1,5.2);
: system("pause");
: return 0;
: }
: 输出结果为:
: a=5,b=5.100000,c=5.200000
: a=5,b=1717986918,c=-925596534325187160000000000000000000000000000000000000000000
: 00.000000
: 想请教各位前辈们
: 为什麽修改第二行printf中的b输出的格式为%d後
: 就连c输出的值也会被影响到呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.118.7.163
1F:推 foxc:了解!!!感谢你的解释~~说的非常清楚~~ 03/24 23:59
2F:推 lytn:迟来的 推 05/26 14:58