| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1358 人关注过本帖
标题:请教下下面C程序的错误
只看楼主 加入收藏
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
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
收藏
得分:0 
以下是引用guhemeng在2013-7-27 23:40:47的发言:

对 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呢? 我用其他数据类型试了一把,报错!   请大神指点~~~~~~~~~~~~

你连va_arg的宏定义都不写出来,问个鬼啊...大家不是神,不是你肚子里的蛔虫...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-07-28 08:12
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
天楚
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:楚地
等 级:小飞侠
帖 子:550
专家分:2113
注 册:2013-3-14
收藏
得分:5 
switch吧,不是which吧

没有哪条路好走,选择了,就坚持下去~~~~
2013-07-28 15:18
cheetah
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:120
专家分:118
注 册:2013-6-29
收藏
得分:0 
你的编程习惯真是太差了,看着都烦!!

天道酬勤
2013-07-29 18:56
guhemeng
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:100
专家分:165
注 册:2013-7-27
收藏
得分:0 
回复 17楼 cheetah
实在抱歉,新手请多多见谅
2013-07-31 21:16
快速回复:请教下下面C程序的错误
数据加载中...
 
   



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

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