k****t 发帖数: 2288 | 1 【 以下文字转载自 CS 讨论区 】
发信人: kermit (kk), 信区: CS
标 题: 请教怎么用#define实现如下的功能
发信站: BBS 未名空间站 (Thu Mar 22 20:10:19 2012, 美东)
给一个字符串,让他转成如下的格式:
比如 #define transfer(A) ........
我这样调用的时候
transfer(“abc”)
能得到如下的东西:
'a','0','b','0','c','0' | h*******s 发帖数: 8454 | 2 好神奇 坐等大牛解答
【在 k****t 的大作中提到】 : 【 以下文字转载自 CS 讨论区 】 : 发信人: kermit (kk), 信区: CS : 标 题: 请教怎么用#define实现如下的功能 : 发信站: BBS 未名空间站 (Thu Mar 22 20:10:19 2012, 美东) : 给一个字符串,让他转成如下的格式: : 比如 #define transfer(A) ........ : 我这样调用的时候 : transfer(“abc”) : 能得到如下的东西: : 'a','0','b','0','c','0'
| d****n 发帖数: 1637 | 3 I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i
ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=transfer("abc") ;
int i;
for(i=0;i<6;++i) putchar(t[i]);
free(t);
} | k****t 发帖数: 2288 | 4 呵呵,你这个很强。
不过我很好奇的就是这个define会占instruction code的size吗?
我的想法很简单:就是简单,不容易出错,代码的size不增加。。。
比如
#include 。。。。
#define transfer(x) 。。。。
const unsigned char StrA1[] = {0xb,0xc,transfer("ABC")};
const unsigned char StrA2[] = {0xd,0xe,transfer("abcdedfg");
const unsigned char StrA3[] = {0xf,0x10,transfer("test signal");
....
【在 d****n 的大作中提到】 : I am not sure what you need. : but by my understand ~ : #include : #include : #include : #define transfer(x) ({char *tmp=(x); \ : int i,sz=strlen(tmp);\ : char *ret=(char *)malloc(sizeof(char)*sz*2);\ : for(i=0;i: ret[2*i]=tmp[i];\
| k****t 发帖数: 2288 | 5 你这个编译有错~~~
说syntex error。
应该是这个define有问题
I am not sure what you need.
but by my understand ~
#include
#include
#include
#define transfer(x) ({char *tmp=(x); \
int i,sz=strlen(tmp);\
char *ret=(char *)malloc(sizeof(char)*sz*2);\
for(i=0;i
ret[2*i]=tmp[i];\
ret[2*i+1]='\0';\
}\
ret;})
int main(){
char *t;
t=transfer("abc") ;
int i;
for(i=0;i<6;++i) putchar(t[i]);
free(t);
}
【在 d****n 的大作中提到】 : I am not sure what you need. : but by my understand ~ : #include : #include : #include : #define transfer(x) ({char *tmp=(x); \ : int i,sz=strlen(tmp);\ : char *ret=(char *)malloc(sizeof(char)*sz*2);\ : for(i=0;i: ret[2*i]=tmp[i];\
| d****n 发帖数: 1637 | 6 you sure?
and no spaces after back slash?
【在 k****t 的大作中提到】 : 你这个编译有错~~~ : 说syntex error。 : 应该是这个define有问题 : : I am not sure what you need. : but by my understand ~ : #include : #include : #include : #define transfer(x) ({char *tmp=(x); \
| d****n 发帖数: 1637 | 7 Try this.
Fill as many char size as you could reach
//file define.c
//transfer must be put at the end of array if overrun index
// and you dont want to calculate the size.
// precisely use trans(x, n) macro
//if you really assign a large char array, then take my first approach.
#include
#include
//unsafe but ok
#define transfer(x) trans(x, 10)
#define trans(x, n) trans##n(x), #x[n]
#define trans10(x) trans9(x), #x[9]
#define trans9(x) trans8(x), #x[8]
#define trans8(x) trans7(x), #x[7]
#define trans7(x) trans6(x), #x[6]
#define trans6(x) trans5(x), #x[5]
#define trans5(x) trans4(x), #x[4]
#define trans4(x) trans3(x), #x[3]
#define trans3(x) trans2(x), #x[2]
#define trans2(x) trans1(x), #x[1]
#define trans1(x) #x[0]
int main(){
int n=7;
char a[]={trans(Hello,4) , transfer(kermit) , '\0' } ;
n=strlen(a);
int i ;
printf("sz %d\n",n);
for(i=0;i
printf("%c ",a[i]);
}
printf("\n");
} | k****t 发帖数: 2288 | 8 sure!
我直接用你的define code编译的。还特意在\后回车到下一行,以确保\后面没有空格。
编译错都是指向t=transfer("abc"),这一行。说syntax error,missing ')' before '
}';
【在 d****n 的大作中提到】 : you sure? : and no spaces after back slash?
| d****n 发帖数: 1637 | 9 你确定没粘错代码?
macro 中间没有空行?
最后一行没有 \
没有comments 插入
我都是编译过了才贴上来的。
把你的代码贴回来,gcc version ?
另外。
strcat(a,"hello kermit");
will do your work.
格。
'
【在 k****t 的大作中提到】 : sure! : 我直接用你的define code编译的。还特意在\后回车到下一行,以确保\后面没有空格。 : 编译错都是指向t=transfer("abc"),这一行。说syntax error,missing ')' before ' : }';
| k****t 发帖数: 2288 | 10 你这是可以运行,但是没有达到我的要求:
我希望是这样的:
比如
char t[]={trans(hello,4)} 的结果是这样的char t[]={'h','\0','e','\0','l','
\0','l','\0','o','\0'},这样size是double的,但是你的运行的结果是:
char t[] = {'h','e','l','l','o'},size只有5.
我后来试验了在后面直接加'\0'就可以了。
比如:
#define trans1(x) #x[0],'\0'
多谢~~~
包子送上~~~~
【在 d****n 的大作中提到】 : Try this. : Fill as many char size as you could reach : //file define.c : //transfer must be put at the end of array if overrun index : // and you dont want to calculate the size. : // precisely use trans(x, n) macro : //if you really assign a large char array, then take my first approach. : #include : #include : //unsafe but ok
| d****n 发帖数: 1637 | 11 趁被大牛骂之前,谢谢你的包子。
代码有风险,编程请小心。 |
|