免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1976 | 回复: 6
打印 上一主题 下一主题

不定参数的问题。(在线等待……) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-12 17:06 |只看该作者 |倒序浏览
我的程序:
static int st_set_array_value(char* pszParam, ...)
{
        va_list arg_ptr;
    char *pszArgValue = NULL;//= (char*)&szParam;
    int nArgCout=0;     //可变参数的数目
    va_start(arg_ptr, pszParam); //以固定参数的地址为起点确定变参的内存起始地址。
   
        pszArgValue = pszParam;
        printf("nArgCount=%d(%s, %d)\r\n", nArgCout, __FILE__, __LINE__);
        while('\0' != pszArgValue[0])
        {
        ++nArgCout;
        printf("the %d th arg: %s\r\n",nArgCout, pszArgValue);     //输出各参数的值
        pszArgValue = va_arg(arg_ptr, char*);//得到下一个可变参数的值
        printf("nArgCount=%d(%s, %d)\r\n", nArgCout, __FILE__, __LINE__);
       if ( (NULL == pszArgValue) || (0 == strcmp( pszArgValue, "\0")) ) /* 采用空串指示参数输入结束 */
      {
        break;
       }
   }   
   printf("nArgCount=%d(%s, %d)\r\n", nArgCout, __FILE__, __LINE__);
    return TRUE;
}

int main(void)
{
        printf("(%s, %d)\r\n", __FILE__, __LINE__);
        st_printer_set_array_value("printer template", "row1", "row2", "row3");
        return TRUE;
}

各位帮我看看这段代码是否有错?为何我输入4个参数,却打印了10个,从第5个开始是乱字符?

论坛徽章:
0
2 [报告]
发表于 2007-07-12 20:06 |只看该作者
按你的算法,应该在最后加一个空字符串表示参数结束:
st_printer_set_array_value("printer template", "row1", "row2", "row3", "");

变长参数一般不是这么用的,而是要在固定参数中提供足够的信息以判断后面变长参数的数量和类型,这样才能用va_arg正确获取后面的变长参数。看一看printf的使用方法,参考va_list的资料仔细揣摩一下。

论坛徽章:
0
3 [报告]
发表于 2007-07-12 20:41 |只看该作者
能否提供例子,或者帮我修改这代码?

论坛徽章:
0
4 [报告]
发表于 2007-07-12 21:58 |只看该作者
例子书上很容易找吧?给你粘一个BSD的man里面带的:

  1.            void foo(char *fmt, ...)
  2.            {
  3.                    va_list ap;
  4.                    int d;
  5.                    char c, *s;

  6.                    va_start(ap, fmt);
  7.                    while (*fmt)
  8.                            switch(*fmt++) {
  9.                            case 's':                       /* string */
  10.                                    s = va_arg(ap, char *);
  11.                                    printf("string %s\n", s);
  12.                                    break;
  13.                            case 'd':                       /* int */
  14.                                    d = va_arg(ap, int);
  15.                                    printf("int %d\n", d);
  16.                                    break;
  17.                            case 'c':                       /* char */
  18.                                    /* Note: char is promoted to int. */
  19.                                    c = va_arg(ap, int);
  20.                                    printf("char %c\n", c);
  21.                                    break;
  22.                            }
  23.                    va_end(ap);
  24.            }
复制代码


调用的时候这样用:
foo("sdscd", "hello", 911, "world", 'x', 110);

sdscd表示后面跟着5个参数,分别是字符串、整形、字符串、字符型、整形。printf也是用的类似的技术。

具体怎么实施还要根据具体的应用具体分析,没有什么“标准”的方法。

论坛徽章:
0
5 [报告]
发表于 2007-07-13 08:46 |只看该作者
谢谢isjfk (mufasa)
我要的是第一个参数也是实际的参数,而不是第一个参数用来指定类型的。我的思路是只传进n个字符串参数,能把这n个参数完整地、不遗漏、不增加地解析出来。

论坛徽章:
0
6 [报告]
发表于 2007-07-13 09:15 |只看该作者
两种解决方法
1. 第一个参数表示字符串的个数,后面是N个字符串
2. 用一个空字符串表示结束

至于你希望的,传入n个参数,又没有任何额外的标识,又希望函数能自动区分出这个n个参数,很遗憾,这是无法实现的...

论坛徽章:
0
7 [报告]
发表于 2007-07-14 02:02 |只看该作者
原帖由 prc 于 2007-7-13 09:15 发表
两种解决方法
1. 第一个参数表示字符串的个数,后面是N个字符串
2. 用一个空字符串表示结束

至于你希望的,传入n个参数,又没有任何额外的标识,又希望函数能自动区分出这个n个参数,很遗憾,这是无法实现的...

也不是完全没有办法,可以用宏替换。把从一个参数的到100个参数的宏都定义上,偶就不相信它能用完100个参数
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP