急!关于c语言可变参数的数量不确定问题
我想写一个函数,接受很多个字符串,但是字符串的数量我不知道,该怎么写这个函数?void getstring (这些参数的数量不知道。。有可能1个,或者2个,3个,5个都有可能) {
}
如果是用课程里讲的,就要知道int n,必须输入这个n的值,但此时我不知道可变参数的数量该怎么办呢? 本帖最后由 溯影 于 2020-1-30 12:01 编辑
C语言里面有可变参数的函数,传参时候用“...”标识,具体的例子比如printf函数,有兴趣可以看一下我的原先用win32api写的printf函数:https://www.0xaa55.com/thread-16881-1-1.html
或者可以自行百度一下C语言可变参数的帖子和例子。 溯影 发表于 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);
} 这个问题不用宏是无解的,因为你不提供任何参数个数信息的话函数本身是无法确定参数到底占据了多大的栈空间。
不过你倒是可以考虑使用宏来一定程度上解决这个问题:#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");
} 641143382 发表于 2020-1-30 11:09
我懂原理,就是通过va_arg一个一个的找,但是怎么退出呢,比如说我输入了很多个参数进去,通过va_arg一个 ...
你看我的帖子了么?我是这么写的:
遍历第一个参数(const char * string),字符串最末尾是'\0',遇到这个字符的时候for循环不成立直接退出了,很简洁的C语言知识。 641143382 发表于 2020-1-30 11:09
我懂原理,就是通过va_arg一个一个的找,但是怎么退出呢,比如说我输入了很多个参数进去,通过va_arg一个 ...
我的是根据你的那个format字符串找的,我的写的是printf函数,不知道符不符合你的要求? Croper 发表于 2020-1-30 11:31
这个问题不用宏是无解的,因为你不提供任何参数个数信息的话函数本身是无法确定参数到底占据了多大的栈空间 ...
可能croper的办法更接近楼主的要求。
页:
[1]