用C中的另一个字符串替换子字符串

时间:2011-08-28 13:32:25

标签: c pointers logic memmove

我正在编写代码来替换所有MACROS及其值。 如果我的宏MAX的值为1000, 在代码中,它必须替换为1000.(我假设一个案例,如果MACROS是一行中的第一个字,那么在那行中我们不会替换MACROS,这种情况我们将以不同的方式处理。 / p>

 //Code to replace MACROS BY THEIR VALUES 

 //line contains the actual one line of the code.  
 //line is initialized to contain as maximum number of charectos(say 100).

 //SrcStr is the macro  and destStr is its value. 

 //This block will be looped  for all lines.

   char* p; 
   p = strstr(line,srcStr);
   if(p != NULL)  //if the srcString is found
   {
      if(strlen(p) != strlen(line)) //special case   
      {
         if( isalnum(*(p-1)) == 0 && isalnum( *(p+strlen(srcStr)))==0 ) 
        // if the next char and prev char to our macro is not a alphabets or digits
             {
/*As answered by medo42 (below)*/     
     memmove(p+strlen(destStr), p+strlen(srcStr),strlen(p+strlen(srcStr)+1);
     memcpy(p,destStr,strlen(destStr));         
             }
           }
         else
         {/* handle differently*/}

       } 

由于我第一次使用memmovememcopy,我怀疑上述代码是否稳定且运行正常。

以上代码是否正确? 所有输入情况的上述代码是否稳定?

2 个答案:

答案 0 :(得分:2)

我发现至少有三个问题:

  1. memmove不应该使用总是要修复的sizeof(p)(例如4),它应该使用strlen(line) - (p + strlen(p) - line)
  2. 您需要处理更换宏的行增加超过100
  3. 的行长的情况
  4. 您需要处理宏标签被符号包围的情况。即,_MACRO_与MACRO不同。

答案 1 :(得分:1)

if(strlen(p) != strlen(line))为什么不在这里简单地使用if(p != line)?这应该是等效的,更容易理解和更快(strlen扫描整个字符串)。

isalnum(...) == 0可能是个人偏好,但我会将该表达式写为!isalnum(...),因为这样更容易理解其含义。

memmove(p+(strlen(destStr)-strlen(srcStr)),p,sizeof(p));这对我来说不对。它将根据您的指针大小移动多个字符,这没有任何意义,如果srcStr比destStr长,则移动的目标可能是行缓冲区开始之前的位置。如果要移动线的其余部分以调整更改的长度,请尝试以下操作:memmove(p+strlen(destStr), p+strlen(srcStr), strlen(p+strlen(srcStr)+1); +1对于移动空终止符也很重要。当然,您需要确保行缓冲区实际上提供了足够的空间。