C变量参数
问题描述:
我有这样的功课:“使用具有可变数量参数的函数从字符串(隐式值或来自KB)确定10个精度双数的最小值。前7个值将被考虑最初,接下来是最后3点,最后是这2点。“那么我做到了这一切,但我不知道为什么它给了我一些奇怪的结果。下面的代码:C变量参数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <conio.h>
double min(double,...);
void main(){
double a,b,c;
printf("Introduceti numerele: ");
scanf("%lf%lf%lf",&a,&b,&c);
printf("\nMinimul este %lf",min(10,1.34,4.34,7,5.23,6.23,2,8.232,a,b,c));
_getch();
}
double min(double x,...){
int i;
double y;
va_list ap;
va_start(ap,x);
y=va_arg(ap,double);
for(i=0;i<x;i++){
if(y>va_arg(ap,double))
y=va_arg(ap,double);
}
va_end(ap);
return y;
}
此外,我不知道为什么编译器知道什么论据是下一个,因为我没有在使用的va_arg(AP,双)。
for(i=0;i<x;i++){
if(y>va_arg(ap,double))
y=va_arg(ap,double);
答
在调用你的函数min
第一个参数是参数的个数,它具有类型int
:
#include <stdarg.h>
double min(int numberOfArgs, ...)
// ^^^
{
va_list argptr;
va_start(argptr, numberOfArgs); // initialize argument pointer
double minData = va_arg(argptr, double); // initialize the minimum with the first argument
// and increment argument pointer
for (int i = 1; i < numberOfArgs; i ++) // for all of the following arguments
{
double data = va_arg(argptr, double); // get argument and increment argument pointer
if (data < minData) // test if argument is less than mnimum
minData = data;
}
va_end(argptr);
return minData;
}
确保所有的参数列表你的论点是浮点double
:
int main()
{
double a, b, c;
printf("Introduceti numerele: ");
scanf_s("%lf%lf%lf", &a, &b, &c);
double minVal = min(10, 1.34, 4.34, 7.0, 5.23, 6.23, 2.0, 8.232, a, b, c)
// ^^ ^^
printf("\nMinimul este %lf", minVal);
return 0;
}
+0
你可以通过坚持一个'双参数:'双分钟(int numargs,double v1,...)'。这可以防止你用0个实际的浮点参数调用它(但并不妨碍你用参数数目0调用它,甚至是否定的 - 但C不是用于白痴的语言)。这意味着你只能在循环体中使用'va_arg()'。 –
什么是奇怪的结果(除了唐纳德特朗普离开理发师时)? –
'_getch'和'conio'不是标准的。 – Olaf
嗯,我得到这样的:-93453434343 –