2016-11-20 2 views
-3

Я пытался построить функцию printf в C++; он работал, но когда я печатаю int и float, я получаю 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 в C++ _ Почему? Почему –

+1

Функция printf, которая использует std :: cout ... original – Treycos

+0

Это было задание, которое я получил. хорошо, я не знал, что вы ставили антипатии из-за того, что сердились на printf – Rokni

ответ

7

Параметры, переданные в вариационную функцию C-стиля, сначала передаются при передаче. char и short продвигаются к int, float повышен до double и т.д.

В результате, ваш va_arg принимает параметр double и не float.

Вы должны изменить

cout << va_arg(Paramters, float); 

в

cout << va_arg(Paramters, double); 

и он должен работать нормально.

Для более подробного объяснения по этому вопросу см этот вопрос: функция

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

+0

Технически интегральные типы, такие как 'char' и' short', всегда передаются при передаче, независимо от того, переданы ли они вариационной функции или нет. И, пожалуйста, не ** плагиат других ответов людей **. Вы копируете/вставляете чужой ответ как свой собственный, а не отмечаете вопрос как дубликат. –

Смежные вопросы