| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2442 人关注过本帖
标题:关于C语言中printf()的简单实现,不用va_list
只看楼主 加入收藏
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:7 
关于C语言中printf()的简单实现,不用va_list
按照我的理解,假设printf实际输入的参数有4个,printf(char* format,arg1,arg2,arg3,arg4);

这些参数在内存中从低地址到高地址依次为format,arg1,arg2,arg3,arg4。

因为format是指针,所以所占的字节大小为一个int的大小。

所以如果我们找到format的储存地址,从format首地址开始,加上一个int的大小,此时地址刚好就是参数arg1的首地址,然后再加上sizeof(arg1),此时地址又刚好是arg2的首地址,这样我们就能依次找出参数所在地址。
  可我写的初步程序运行的时候结果与期望不同呢?,哪位老哥看看呗
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: printf 参数 format 地址 大小 
2017-10-20 07:16
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
贴代码 不要图片

另:printf 貌似是反向入栈的

DO IT YOURSELF !
2017-10-20 09:15
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
谁告诉你变量是连续存储的?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-10-20 11:05
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
程序代码:
#include<stdio.h>
int myprintf( const char*format, ...)
{
    int *p;
    char c;
    p=(int*)&format;
        while((c=*format++)!='\0')
    {
        if(c!='%')
        {
            putchar(c);
            continue;
        }
        else
        {
            c=*format++;
            if(c=='d')
            {
                       int value;
                            p++;
                value=*p;
                printf("%d",value);
            }
            if(c=='x')
            {
                int value;
                p++;
                value=*p;
                printf("%d",value);
            }
        }
    }    
    return 0;
}
int main(void)
{
        myprintf("a=%d,b=%x\n",700,200,100);
        //test(100,200,300,400);
    return 0;
}
/*
int test(int a,int b,int c,int d)
{
        int *p;
    p=&a;
    printf("p=%d\n",*p);
    printf("a=%d\n",*p);
    p--;
        printf("b=%d\n",*p);
    p--;
        printf("c=%d\n",*p);
    p--;
    printf("d=%d\n",*p);
    printf("&a=%p\n",&a);
    printf("&b=%p\n",&b);
    printf("&c=%p\n",&c);
    printf("&d=%p\n",&d);

    return 0;
}
*/

我一开始用来测试的test函数发现就能正确输出啊
2017-10-20 18:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
回复 4楼 天霁
感觉应该是可变长度参数的储存方式不是按顺序储存的~还是去参考一下如何获取可变长度参数比较合理~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-20 18:45
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
回复 5楼 九转星河
可我说的myprintf()的实现是看了《李明新概念C教程》中的实现自己的printf一节的,他视频中也讲了是可以这样做的,而且也写代码成功运行了,为啥在我电脑上就不行了呢??
链接: https://pan.baidu.com/s/1nu79wDz 密码: uxq3
2017-10-20 22:38
天霁
Rank: 2
等 级:论坛游民
帖 子:33
专家分:18
注 册:2015-7-17
收藏
得分:0 
回复 2楼 wp231957
参数是自右向左入栈么?我贴的代码里,注释掉的test()提前测试了一下,的确是可以通过创建指针,初始为左端字符串地址,之后每次递增,来获得各个参数地址啊。
2017-10-20 22:42
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
可以把问题进一步简化 见代码
程序代码:
#include<stdio.h>

void myprintf( const char*format, ...)
{
    int *p=(int*)&format;
    printf("%d ",*++p);
    printf("%d ",*++p);
    printf("%d ",*++p);
}
int main(void)
{
    myprintf("a=%d,b=%x\n",700,200,100);
    return 0;
}


DO IT YOURSELF !
2017-10-21 09:45
快速回复:关于C语言中printf()的简单实现,不用va_list
数据加载中...
 
   



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

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