2016-11-20 86 views
-3

我试图在C++中构建printf函数;它的工作,但是当我打印intfloat,我得到一个0我输入的任何值。C++ cout正在打印错误值

#include <iostream> 
#include <stdarg.h> 

using namespace std; 

void printf1(const char* varlist, ...) 
{ 
int i = 0; 
va_list Paramters; 
va_start(Paramters, varlist); 
while (varlist[i] != '\0') 
{ 
    if (varlist[i] == '%') 
    { 
     switch (varlist[i + 1]) 
     { 
     case 's': 
      cout << va_arg(Paramters, const char*); 
      cout << ' '; 
      break; 
     case 'i': 
      cout << va_arg(Paramters, int); 
      cout << ' '; 
      break; 
     case 'f': 
      cout << va_arg(Paramters, float); 
      cout << ' '; 
      break; 
     } 
    } 
    ++i; 
} 
va_end(Paramters); 
cout << endl; 
} 

int main() 
{ 
float f = 3.5; 
printf1("%f", f); 
int num = 2; 
printf1("%i", num); 
return 0; 
} 
//0 
//0 
//Press any key to continue . . . 

对不起间距,但这里复制粘贴很奇怪。

+1

_printf功能++ _为什么?为什么 –

+1

使用std :: cout的printf函数... original – Treycos

+0

这是我得到的任务。以及我不知道你因为印象而生气,所以不喜欢 – Rokni

回答

7

传递给C风格可变参数函数的参数在传递时首先被提升。 charshort被晋升为intfloat晋升为double

其结果是,你va_arg收到double参数,而不是一个float

您需要更改

cout << va_arg(Paramters, float); 

cout << va_arg(Paramters, double); 

,它应该只是罚款。

有关此主题的详细说明,请参阅这个问题:在C

Variadic function (va_arg) doesn't work with float?

+0

从技术上讲,像'char'和'short'这样的整数类型在传递时总是被提升,而不管它们是否传递给可变参数函数。请不要**抄袭他人的答案**。您将自己的答案复制/粘贴为自己的答案,而不是将问题标记为重复。 –