由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教怎么用#define实现如下的功能
相关主题
free(char *)的问题 (转载)为什么这个小程序错了?
C 语言,初学者,简单问题Weird! string length problem.
little endian vs big endian请帮忙看看这个字符函数的错误在哪里
C的问题,困惑中怎么判断int a[]的array的实际长度?
请教C的类型转换问题C++ 初级再初级问题
[合集] 6个变态的C语言写的Hello World (ZZ)请教一个字符串比较排序的问题
strlen怎么实现的请问以下代码有什么错误?
c++ template中如何判断类型c question
相关话题的讨论汇总
话题: define话题: char话题: transfer话题: ret话题: sz
进入Programming版参与讨论
1 (共1页)
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
趁被大牛骂之前,谢谢你的包子。
代码有风险,编程请小心。
1 (共1页)
进入Programming版参与讨论
相关主题
c question请教C的类型转换问题
gcc 优化不优化运算结果不一样?gcc 的 bug?[合集] 6个变态的C语言写的Hello World (ZZ)
const char *p, is it ok to change p[1] ?strlen怎么实现的
请教一个C语言的面试题c++ template中如何判断类型
free(char *)的问题 (转载)为什么这个小程序错了?
C 语言,初学者,简单问题Weird! string length problem.
little endian vs big endian请帮忙看看这个字符函数的错误在哪里
C的问题,困惑中怎么判断int a[]的array的实际长度?
相关话题的讨论汇总
话题: define话题: char话题: transfer话题: ret话题: sz