| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
Reworld,下班在家制作游戏,1500万奖金等你拿以码会友 以友辅仁
共有 278 人关注过本帖, 1 人收藏
标题:双引号中如何使用变量
只看楼主 加入收藏
纯蓝之刃
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册:2019-7-29
结帖率:100%
  已结贴   问题点数: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: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:59
专家分:119
注 册: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
等 级:版主
威 望:322
帖 子:6637
专家分:38390
注 册: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: 10Rank: 10Rank: 10
来 自:CC
等 级:贵宾
威 望:24
帖 子:1191
专家分:1918
注 册:2007-12-27
  得分:0 
格式串是个字符串,字符串存在字符数组里面的时候,单个数组元素是可修改的,修改完以后把数组名送给printf当格式串用就是。
这样就不必涉及重载了,更C一些。

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


别人能不等于你能,别人不能不等于你不能
不要问别人能不能,要说:我能
2019-09-19 10:12
纯蓝之刃
Rank: 1
等 级:新手上路
帖 子:11
专家分:1
注 册: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
等 级:版主
威 望:322
帖 子:6637
专家分:38390
注 册: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
快速回复:双引号中如何使用变量
数据加载中...
 
   





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

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