鱼C论坛

 找回密码
 立即注册
查看: 2240|回复: 6

急!关于c语言可变参数的数量不确定问题

[复制链接]
发表于 2020-1-30 09:13:37 | 显示全部楼层 |阅读模式

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

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

x
我想写一个函数,接受很多个字符串,但是字符串的数量我不知道,该怎么写这个函数?

void getstring (这些参数的数量不知道。。有可能1个,或者2个,3个,5个都有可能) {

}

如果是用课程里讲的,就要知道int n,必须输入这个n的值,但此时我不知道可变参数的数量该怎么办呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-30 09:49:57 | 显示全部楼层
本帖最后由 溯影 于 2020-1-30 12:01 编辑

C语言里面有可变参数的函数,传参时候用“...”标识,具体的例子比如printf函数,有兴趣可以看一下我的原先用win32api写的printf函数:https://www.0xaa55.com/thread-16881-1-1.html
或者可以自行百度一下C语言可变参数的帖子和例子。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-30 11:09:34 | 显示全部楼层
溯影 发表于 2020-1-30 09:49
C语言里面有可变参数的函数,传参时候用*标识,具体的例子比如printf函数,有兴趣可以看一下我的原先用win3 ...

我懂原理,就是通过va_arg一个一个的找,但是怎么退出呢,比如说我输入了很多个参数进去,通过va_arg一个一个的找,怎么退出这个while循环,下面这段是错误的,要打印出乱码。

int print( const char*format,... )
{
     va_list args;
     const char *args1;   
     va_start(args, format);

     while ((args1 = va_arg(args,const char *) ) != char* ){
             printf(args1);
         }
     va_end(args);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-30 11:31:35 | 显示全部楼层
这个问题不用宏是无解的,因为你不提供任何参数个数信息的话函数本身是无法确定参数到底占据了多大的栈空间。
不过你倒是可以考虑使用宏来一定程度上解决这个问题:
#include <stdio.h>
#include <stdarg.h>

void __getstr(int n, ...) {
        printf("一共接受到%d个字符串\n",n);
        va_list iter;
        va_start(iter, n);
        for (int i = 0; i < n; ++i) {
                printf("%s\n", va_arg(iter,const char*));
        }
        va_end(iter);
}
#define EXPAND(...) __VA_ARGS__
#define CPARAM10(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10,argnum,...) argnum
#define CPARAM(...) EXPAND(CPARAM10(__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0))

#define getstr(...) __getstr(CPARAM(__VA_ARGS__),__VA_ARGS__)
int main() {
        getstr("one", "two", "three");
        getstr("hello world");

        system("pause");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-30 12:00:10 | 显示全部楼层
641143382 发表于 2020-1-30 11:09
我懂原理,就是通过va_arg一个一个的找,但是怎么退出呢,比如说我输入了很多个参数进去,通过va_arg一个 ...

你看我的帖子了么?我是这么写的: 2020-01-30_115943.png
遍历第一个参数(const char * string),字符串最末尾是'\0',遇到这个字符的时候for循环不成立直接退出了,很简洁的C语言知识。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-30 12:02:22 | 显示全部楼层
641143382 发表于 2020-1-30 11:09
我懂原理,就是通过va_arg一个一个的找,但是怎么退出呢,比如说我输入了很多个参数进去,通过va_arg一个 ...

我的是根据你的那个format字符串找的,我的写的是printf函数,不知道符不符合你的要求?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-30 12:03:40 | 显示全部楼层
Croper 发表于 2020-1-30 11:31
这个问题不用宏是无解的,因为你不提供任何参数个数信息的话函数本身是无法确定参数到底占据了多大的栈空间 ...

可能croper的办法更接近楼主的要求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 05:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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