注册 登录
编程论坛 C语言论坛

双引号中如何使用变量

纯蓝之刃 发布于 2019-09-18 21:35, 3350 次点击
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来区别不同类型的打印
5 回复
#2
bcbbcclbbc2019-09-19 00:52
是想用"%‘type’"来代替"%d",这样好像行不通。或许可以试一下宏定义。
void print(char *describe,char *name,void *value,char type)
{
    char *p="%s,%s,%d";
    printf(p,describe,name,value);
}

记录指针:aa4195860

这样可以输出,但前面的HisRec要加上双引号。
可能有些小问题
#3
rjsp2019-09-19 09:23
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宏里加什么。
#4
forever742019-09-19 10:12
格式串是个字符串,字符串存在字符数组里面的时候,单个数组元素是可修改的,修改完以后把数组名送给printf当格式串用就是。
这样就不必涉及重载了,更C一些。

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

#5
纯蓝之刃2019-09-19 10:46
回复 3楼 rjsp
谢谢你的回答,不过程序是纯c的,如果较上重载的特性,不就需要变成.cpp的C++了么。
还有刚才你提到的void的指针的问题,我确实想请教一下这个应该怎么改才好,这个HisRec是结构体里的数据,类型是在变的,就像type一样。我只是临时这么用了,虽然目前能正常运行,但是会报类型不一致的告警。

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

#6
rjsp2019-09-19 12:18
以下是引用纯蓝之刃在2019-9-19 10:46:22的发言:

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