首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

怎么把字符串替换成值

2012-03-19 
如何把字符串替换成值一个字符串中对应一个变量名,怎么把这个变量名替换成它的值比较好了,如下:charbuffer

如何把字符串替换成值
一个字符串中对应一个变量名,怎么把这个变量名替换成它的值比较好了,如下:
char   buffer[256]= "welcome   to   (WEB_SITE) ";
//同时有一个WEB_SITE的定义,如下:
char   WEB_SITE[34]= "CSDN ";
//括号里面的字符串是一个变量,替换后希望输出的内容是:
//welcome   to     CSDN
typedef   struct   _SiteMap{
  char   CmpName[256];
  char   RealContent[256];
}SiteMap;

char   NODE_SITE[256];
SiteMap   mySite[2];

int     example(void)
{      
      int   cnt=0;
      int   len=0;
      char   *pCur,*pFirst;
      char   outbuf[256];
      memset(outbuf,0x0,256);
      strcpy(WEB_SITE, "china ");
      strcpy(mySite[0].CmpName, "WEB_SITE ");
      strcpy(mySite[0].RealContent,WEB_SITE);
      strcpy(mySite[1].CmpName, "NODE_SITE ");
      strcpy(mySite[1].RealContent,NODE_SITE);
      pCur=buffer;
      while(   (pCur!=   NULL)&&(*pCur!=0)   ){
              if(   *pCur   ==   '( '   ){
                        pFirst   =   pCur;
                        pCur++;
                        continue;
                  }else   if   (   *pCur   ==   ') ')   {
                      if   (   (pCur-pFirst)   <=0   ){return   -1;}
                      break;
                  }else   {
                    pCur++;
                  }
      }
      for(   cnt;   cnt <2;   cnt++   ){
              if(   0   ==   strncmp(pFirst+1,mySite[cnt].CmpName,pCur-(pFirst+1))   ){
strncpy(outbuf,buffer,pFirst-buffer);
len=strlen(outbuf);
sprintf(&outbuf[len], "%s ",mySite[cnt].RealContent);
                len=strlen(outbuf);
sprintf(&outbuf[len], "%s ",pCur+1);  
      }
      }
        printf( "%s\n ",outbuf);
        return   0;
}

这种方法感觉还是有些复杂,又没有更简单一点的方法了!
能够直接把字符串变成它对应的值。




[解决办法]
已经不错了.
[解决办法]

怎么咋看像要 rtti
[解决办法]
c里面好象不能这样.
用宏定义能实现部分功能
[解决办法]
正则中的替换
[解决办法]
正则可以考虑

不过使用宏的话也可以解决上面的问题!



#define buffer(x) "welcome to "#x
#define PRINTF(y) printf(buffer(y))

main()
{
PRINTF(CSDN);

}

[解决办法]
不知道这样可不可以?


#include <stdio.h>

#define WEB_SITE CSDN
#define BUFFER welcome to WEB_SITE
#define str(a) # a
#define tostr(a) str(a)


int main()
{
char buffer[256]=tostr(BUFFER);
char web_site[34]=tostr(WEB_SITE);

printf( "%s\n ", buffer);
printf( "%s\n ", web_site);

getchar();

return 0;
}
[解决办法]
这样怎么样?把顺序调成这样,可能和你要求的优点接近

#include <stdio.h>
#define BUFFER welcome to WEB_SITE
#define str(a) # a
#define tostr(a) str(a)
char buffer[256]=tostr(BUFFER);
char web_site[34]=tostr(WEB_SITE);
#define WEB_SITE CSDN
char outbuf[256]=tostr(BUFFER);

int main()
{
printf( "%s\n ", buffer);
printf( "%s\n ", web_site);
printf( "%s\n ", outbuf);
getchar();
return 0;
}
[解决办法]
char buffer[256]= "welcome to (WEB_SITE) ";
char REPLACE_SYM[15]= "(WEB_SITE) ";
char REPLACE_VAL[34]= "CSDN ";
size_t rplLen = strlen(REPLACE_SYM);
size_t rplValLen=strlen(REPLACE_VAL);
char *tailGuardPoint=buffer+255;//the last position is left for ZERO
char *headGuardPoint=buffer-1;
char *tail= buffer+strlen(buffer);
char *cur = buffer+strlen(buffer)-rplValLen;
bool inflation=rplValLen> rplLen;
while( cur!=headGuardPoint)
{
if( strncmp(cur, "(WEB_SITE) ",rplLen)==0 )
{
if( !inflation )
{
strcpy( cur+rplValLen, cur+rplLen );
}else
{
//.......如果使整个字符串膨胀了,需要做两件事情,
//1.看是否大于等于tailGuardPoint判断是否溢出
if( cur+rplValLen+(tail-cur-rplLen)> =tailGuardPoint )
{
fprintf(stderr, "buffer overflow! Exit! ");
return 0;
}
//2.把后部的子串移位,从尾巴开始移位。这儿就懒得写了。
}
strncpy(cur,REPLACE_VAL,rplValLen);
tail = cur+rplValLen-rplLen;
}
--cur;
}
fprintf(stdout, "%s\n ",buffer );
[解决办法]

to cpaal(蜗牛): :)

to Chiyer(星羽): 怎么咋看像要 rtti。
> 不怎么明白rtti的实现。

To cceczjxy():
> c里面好象不能这样.
> 用宏定义能实现部分功能.

呵呵,宏感觉也不行。

-----------------------

RTTI是运行中执行
其意思是要你在运行的时候完成字符串转换
楼主说感觉宏不行
按宏写很难出来
运行时解析匹配可能是比较土但是肯定能实现的办法

热点排行