搜索
bottom↓
回复: 13

C语言编译时有没有办法自动合并字符串

[复制链接]

出0入4汤圆

发表于 2012-9-4 11:08:54 | 显示全部楼层 |阅读模式
我想实现这个功能,
举个例子:
执行函数
Display(1,1,"今天好天气");  //显示今天好天气
Display(1,1,"明天好天气");  //显示明天好天气
Display(1,1,"今天好好气");  //显示今天好好气
Display(1,1,"明天好好气");  //显示明天好好气
还有很多情况.等等..


不想这样定义
#define                aa  "今天好天气"
//#define                aa  "明天好天气"
Display(1,1,aa);                //更改aa的定义可以实现整个字符串不同显示

想用一种定义方法实现
把字符串中的,"今天好天气",这个字符串拆分出来, 变成"今天"+"好天气"


伪代码如下:
#define        A1        "今天"
#define        A2        "好天气"

Display(1,1,A1+A2);         //显示今天好天气,这里在编译时编译器已经帮我完成合并了


如改为
#define        A1        "明"
#define        A2        "天好天气"

Display(1,1,A1+A2);         //显示明天好天气,这里在编译时编译器已经帮我完成合并了

这样我改变A1,A2的定义,编译器编译时可以方便帮我定义好更改显示
试过用连接符,但不成功
请教一下大家,在C语言中有没有办法可以实现这个功能。如果有,如何实现?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-9-4 11:10:52 | 显示全部楼层
Display(1, 1, A1 A2)试试
这样应该是可以的

出0入0汤圆

发表于 2012-9-4 11:32:28 | 显示全部楼层
看这个,里面有讲“宏中"#"和"##"的用法”

C语言常用宏定义技巧
http://www.amobbs.com/forum.php? ... F%E5%AE%9A%E4%B9%89

出0入0汤圆

发表于 2012-9-4 11:33:38 | 显示全部楼层
本帖最后由 chinabn 于 2012-9-4 11:39 编辑

楼上正解
或者
采用printf格式化
或字符串函数

我建议2楼的方法

出0入4汤圆

 楼主| 发表于 2012-9-4 11:55:01 | 显示全部楼层
谢谢楼上各位,用2楼的方法可以实现..

出0入0汤圆

发表于 2012-9-4 12:06:12 | 显示全部楼层
普通的解决办法: 写两个display语句, 控制好位置
文艺的解决办法: 用宏定义的#或##拼接
那啥的解决办法: 用strcat函数

出0入0汤圆

发表于 2012-9-4 12:24:46 | 显示全部楼层
用##的方法没有成功。
请大侠示范一下,谢谢!

出0入0汤圆

发表于 2012-9-5 11:27:23 | 显示全部楼层
himm007 发表于 2012-9-4 12:24
用##的方法没有成功。
请大侠示范一下,谢谢!

#define CONS(a,b)    (a##b)

#define K                 "你好"
#define J                 "!"

Display(CONS(K,J));

出0入0汤圆

发表于 2012-9-5 11:30:12 | 显示全部楼层
使用#和##是不是都不能用变量?
能的话怎么使用?
求大侠们解答。

出0入0汤圆

发表于 2012-9-5 11:58:24 | 显示全部楼层
Tliang 发表于 2012-9-5 11:27
#define CONS(a,b)    (a##b)

#define K                 "你好"

#include <stdio.h>

#define A "111"
#define B "222"
#define CONS(a,b) (a##b)

int main(void) {

   printf("%s\n", CONS(A,B));

   return 0;
}

Ubuntu  gcc 4.6.3 编译出错


test.c: In function 'main':
test.c:9:1: error: 'AB' undeclared (first use in this function)
test.c:9:1: note: each undeclared identifier is reported only once for each function it appears in

出0入0汤圆

发表于 2012-9-5 13:33:02 | 显示全部楼层
himm007 发表于 2012-9-5 11:58
#include

#define A "111"

我在KEIL里面用的没问题

出0入0汤圆

发表于 2012-9-5 13:38:47 | 显示全部楼层
himm007 发表于 2012-9-5 11:58
#include

#define A "111"

我没用宏定义的试的,直接
CONS("123","123")这样可以。。。
用了宏定义后
#define J "123"
#define K "123"

然后
CONS(J,K)
这样也不行。。
他将J和K结合在一起了。变成JK了。。。

出0入0汤圆

发表于 2012-9-5 14:16:35 | 显示全部楼层
himm007 发表于 2012-9-5 11:58
#include

#define A "111"

#define _Str(s) #s

#define Str(s) _Str(s)

#define i 12334

#define J 123
#define K 321

#define _CONS(a,b) a##b
#define CONS(a,b) _CONS(a,b)

Display(Str(CONS(J,K)), 0, 0, 0);

通过。。
不过不能用变量。。

出0入0汤圆

发表于 2012-9-5 15:17:41 | 显示全部楼层
Tliang 发表于 2012-9-5 14:16
#define _Str(s) #s

#define Str(s) _Str(s)

不错,但是有点复杂了,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 17:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表