标题:双引号中如何使用变量
只看楼主
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
结帖率:93.75%
已结贴  问题点数:20 回复次数:5 
双引号中如何使用变量
void print(char *describe,char *name,void *value,char type);

int main()
{
        print("记录指针:","aa",HisRec,'d');
}

void print(char *describe,char *name,void *value,char type)
{
    printf("%s%s%'type'\n",describe,name,value);
}

就是定义的这个type如何使用。由于print参数3类型不确定,所以想使用type来区别不同类型的打印
搜索更多相关主题的帖子: void char 双引号 type print 
2019-09-18 21:35
bcbbcclbbc
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:11
帖 子:194
专家分:528
注 册:2019-8-15
得分:0 
是想用"%‘type’"来代替"%d",这样好像行不通。或许可以试一下宏定义。
void print(char *describe,char *name,void *value,char type)
{
    char *p="%s,%s,%d";
    printf(p,describe,name,value);
}

记录指针:aa4195860

这样可以输出,但前面的HisRec要加上双引号。
可能有些小问题
2019-09-19 00:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
HisRec 是什么,它能转成 void* 吗?这才是最关键的问题。
即便强转也没用,printf在压参时是根据类型来定的。随便举个例子 short、long long、float、double 你分别怎么处理?
而你想问的那个问题,其实只要
char fmt[8];
sprintf( fmt, "%%s%%s%%%c\n", type );
printf( fmt, describe, name, value );
就行。

当然,也不是没有解决手段,比如用 _Generic 进行重载
程序代码:
#include <stdio.h>

#define print(describe,name,value) printf( _Generic( (value),          int: "%s%s%d\n" \
                                                            ,       double: "%s%s%g\n" \
                                                            ,  const char*: "%s%s%s\n" \
                                                            ,        char*: "%s%s%s\n" \
                                                    ), describe, name, value )


int main( void )
{
    print( "demo", ": ", 123 );
    print( "demo", ": ", 12.3 );
    print( "demo", ": ", "abc" );
}
你需要什么类型,就往那个print宏里加什么。
2019-09-19 09:23
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
格式串是个字符串,字符串存在字符数组里面的时候,单个数组元素是可修改的,修改完以后把数组名送给printf当格式串用就是。
这样就不必涉及重载了,更C一些。

[此贴子已经被作者于2019-9-19 10:14编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2019-09-19 10:12
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:0 
回复 3楼 rjsp
谢谢你的回答,不过程序是纯c的,如果较上重载的特性,不就需要变成.cpp的C++了么。
还有刚才你提到的void的指针的问题,我确实想请教一下这个应该怎么改才好,这个HisRec是结构体里的数据,类型是在变的,就像type一样。我只是临时这么用了,虽然目前能正常运行,但是会报类型不一致的告警。

[此贴子已经被作者于2019-9-19 10:50编辑过]


一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2019-09-19 10:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用纯蓝之刃在2019-9-19 10:46:22的发言:

谢谢你的回答,不过程序是纯c的,如果较上重载的特性,不就需要变成.cpp的C++了么。
我给你的就是纯C的,不是C++的,C++是编译不了的。
此处是C版块,如果我给你的不是C代码,我肯定会预先说明的;假使用了非标准C代码(比如某个编译器的扩展),我也会预先说清楚的。
但我在3楼给出的C代码,是标准标准的C语法,没有使用一丝一毫非标准的语法。只要你的编译器支持C语言,那就应当能编译通过;如果编译失败,只能说明你的C编译器有问题。
2019-09-19 12:18



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




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

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