标题:请教下下面C程序的错误
取消只看楼主
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
结帖率:100%
已结贴  问题点数:20 回复次数:10 
请教下下面C程序的错误
代码段如下:  gcc 编译报错:vprintf.c: In function ‘tprintf’:  vprintf.c:20: error: expected ‘;’ before ‘{’ token
               错误很简单,少个分号, 问题是我觉得不应该有这个错误,  压根不知道  “;”该加在哪?  
#include<stdio.h>
#include<stdarg.h>
#include<string.h>

void tprintf(const char*format,...)
{
        va_list ap;
        int i;
        va_start(ap,format);
        if(format==NULL)printf("Defined error!");
        for(i=0;i<strlen(format);i++)
        which(*(format+i))
          {
            case 'd':printf("%d\n",va_arg(ap,int));break;
            case 'c':printf("%c\n",va_arg(ap,char));break;
            case 's':printf("%s\n",va_arg(ap,char));break;
            case 'f':printf("%f\n",va_arg(ap,float));break;
            default:printf("%s\n",format);break;
          }
        va_end(ap);
}

int main()
{
        char a[]="cds";
        tprintf(a,'r',14,"zou");
        printf("%c%d%s\n",'r',14,"zou");
        return 0;
}
搜索更多相关主题的帖子: function expected include before 
2013-07-27 22:07
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
注释代码我删掉了些,所以不再是第20行,不好意思。   错误点在: switch这里,gcc 提示这少个分号,有点莫名其妙啊!
2013-07-27 22:09
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
  怎么没朋友帮忙解答下子~~~~~~~~~~~
2013-07-27 22:42
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
回复 4楼 qq525273446
这个是可变参函数,这个可以不用管的,问题点是在: gcc报错说 switch 的{ 前少个分号,这个是我奇怪的地方,而且也不知道该如何解决!
2013-07-27 22:56
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
回复 5楼 qq525273446
不明白你的意思哈
2013-07-27 22:58
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
回复 5楼 qq525273446
变参函数的第一个参数是固定参数, char *,个数是不限定的,不然怎么叫变参咯!
2013-07-27 23:00
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
回复 10楼 qq525273446
  无语中~~~~~~~~~     改过来了,进行其他错误调试,谢谢!
2013-07-27 23:20
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
修正后,正确代码如下:  调试运行正确,只是个别地方还需要再理解下!   与各位新手共勉!


#include<stdio.h>
#include<stdarg.h>
#include<string.h>

void tprintf(const char*format,...)
{
        va_list ap;
        int i;

        va_start(ap,format);
        if(format==NULL)printf("Defined error!");
        for(i=0;i<strlen(format);i++)
        switch(*(format+i))
          {
            case 'd':printf("%d\n",(int)va_arg(ap,int));break;
            case 'c':printf("%c\n",(char)va_arg(ap,int));break;
            case 's':printf("%s\n",(char*)va_arg(ap,int));break;
            case 'f':printf("%f\n",(float)va_arg(ap,double));break;
            default:printf("%s\n",format);break;
          }
        va_end(ap);
}

int main()
{
        char a[]="cds";
        tprintf(a,'r',14,"zou");
        printf("%c%d%s\n",'r',14,"zou");
        return 0;
}
2013-07-27 23:33
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
对 va_arg()这个宏定义还是很模糊,虽然根据报错把代码修正了过来,但是还是不知道为什么要这样修正啊!
case 'd':printf("%d\n",(int)va_arg(ap,int));break;
            case 'c':printf("%c\n",(char)va_arg(ap,int));break;
            case 's':printf("%s\n",(char*)va_arg(ap,int));break;
            case 'f':printf("%f\n",(float)va_arg(ap,double));break;
            default:printf("%s\n",format);break;

为何va_arg(),括号里面一定是int,double呢? 我用其他数据类型试了一把,报错!   请大神指点~~~~~~~~~~~~
2013-07-27 23:40
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
得分:0 
  找到依据了,如下:  原来是C语言的定义问题!  va_arg(ap,type)   type的类型隐性规定:int   double   char* 这三类,其他的都是不接受的type!

简单的说,我们用va_arg(ap,type)取出一个参数的时候,
type绝对不能为以下类型:
——char、signed char、unsigned char
——short、unsigned short
——signed short、short int、signed short int、unsigned short int
——float


一个简单的理由是:
——调用者绝对不会向my_printf传递以上类型的实际参数。


在C语言中,调用一个不带原型声明的函数时:
调用者会对每个参数执行“默认实际参数提升(default argument promotions)”。

同时,对可变长参数列表超出最后一个有类型声明的形式参数之后的每一个实际参数,也将执行上述提升工作。
提升工作如下:
——float类型的实际参数将提升到double
——char、short和相应的signed、unsigned类型的实际参数提升到int
——如果int不能存储原值,则提升到unsigned int

然后,调用者将提升后的参数传递给被调用者。
所以,my_printf是绝对无法接收到上述类型的实际参数的。
2013-07-28 13:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418076-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.846648 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved