鱼C论坛

 找回密码
 立即注册
查看: 2865|回复: 9

c语言 写一个c函数 请帮帮我啊

[复制链接]
发表于 2018-12-24 21:26:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

◆当输入一个参数时,计算它的平方
◆当输入两个参数时,计算它们的平方的和
◆当输入参数超过三个时,输入错误信息,并返回
写一个 c语言 函数

怎么判断输入了多少个参数啊?
我自己 通过判断scanf的返回值为多少 写了一下
但是行不通啊
那位大神能帮帮我啊???????????
谢谢啦。。。。。。。。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-12-24 21:27:00 | 显示全部楼层
谁能帮帮我啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-24 21:27:35 | 显示全部楼层
没人吗?
帮我看看呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-24 21:28:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-24 22:54:47 | 显示全部楼层
C语言有一种长度不确定的参数,形式为 "...",如printf函数就使用了这个参数,因为输出参数不会确定,使用方法好像是定义好的宏,具体怎么用你可以百度看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-24 22:57:34 | 显示全部楼层
可以使用默认参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-25 00:25:39 | 显示全部楼层
TOP_LK 发表于 2018-12-24 22:57
可以使用默认参数



C好像没法使用默认参数。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-25 00:47:03 | 显示全部楼层
本帖最后由 Croper 于 2018-12-25 00:59 编辑

试了下,用宏也没法搞定

这是我能想出来最接近的答案了
int func(int num,...)
{
        va_list list;
        int a,i;
        int sum = 0;
        //if (num > 2) printf("参数过多");
        va_start(list, num);
        for (i = 0; i < num; i++)
        {
                a = va_arg(list, int);
                sum += a * a;
        }
        va_end(list);
        return sum;
}
但是还是得先输入你想要出输入的参数的个数,比如3的平方,需要写成func(1,3),而2和3的平方和,需要写成func(2,2,3);

话说你要这功能直接换c++好了,重载或者默认参数哪一个都能简单快捷地解决你的问题


嗯。。另外。。你想要大于两个参数报错的话把那行注释去掉就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-25 01:45:50 | 显示全部楼层
c函数写出来了,main函数有点问题,希望对你有帮助
#include<stdio.h>
#include<stdarg.h>
#define NUM 2
void func(int n, ...);
void func(int n, ...)
{
        int sum=0;
        int a;
        va_list vap;
        va_start(vap,n);
        if(n>2)
        {
                printf("输入信息错误!\n");
        }
        else
        {
                for(int i=0;i<2;i++)
                {
                        a=va_arg(vap,int);
                        sum+=a*a;
                }
                va_end(vap);
                printf("计算结果为%d\n",sum);
        }
}
int main(void)
{
        int a[NUM];
        //int b,c;
        for(int i=0;i<NUM;i++)
        {
                printf("请输入第%d个数字:",i+1);
                scanf("%d",&a[i]);
        }
        //b=a[0];
        //c=a[1];
        //func(NUM,b,c);
        func(NUM,a[0],a[1]);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-25 05:05:30 | 显示全部楼层
#include <stdio.h>

int func(int num,...);
int main(void)
{
        func(5);
        func(15, 20);
        func(25, 30, 30);
        func(35, 20, 30, 40);//测试用,参数随意填写
        return 0;
}

int func(int num,...)
{
        int  *i, *j, k=0;
        i = j = &num;

       
        j -= 1;
        j = *j;
        k = *j;
        k &= 0x00ff0000;
        k = (k >> 16)/sizeof(int);//这几句通过取得函数返回地址,进而取得函数返回后下一条指令的指令字节码,放入K中,由于下一条指令是平衡堆栈,指令中有调用函数时推入栈的参数的字节数,取出该数除以int占用的字节就是参数的数量
       
        if (k > 2)
        {
                printf("参数过多!\n");
        }
        else if (k == 2)
        {
                printf("%d\n", (*i) * (*i) + (*(i + 1))* (*(i + 1)));
        }
        else if (k == 1)
        {
                printf("%d\n", num*num);
        }

        return 0;
}

以上代码只能在32位编译器测试成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 02:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表