Я пишу код для замены всех МАКРОСОВ его значением. Если мой макрос MAX имеет значение 1000, и в коде его необходимо заменить на 1000. (Я предполагаю, что если МАКРОСЫ являются первым словом в строке, то в этой строке МАКРОСЫ не будут заменены, и в этом случае к нам поступят иначе.

 //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*/}

       } 

Поскольку я использую memmove и memcopy впервые, я сомневаюсь, что приведенный выше код стабилен и работает правильно.

Правильный ли приведенный выше код? И стабилен ли приведенный выше код для всех случаев ввода?

0
Muthu Ganapathy Nathan 28 Авг 2011 в 17:32

2 ответа

Лучший ответ

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 также важен для перемещения нулевого терминатора. Конечно, вам нужно убедиться, что строковый буфер действительно предоставляет достаточно места.

1
Medo42 28 Авг 2011 в 14:27

Я вижу как минимум три проблемы:

  1. memmove не должен использовать sizeof(p), который всегда будет исправлен (скажем, 4), он должен использовать strlen(line) - (p + strlen(p) - line)
  2. Вам нужно обработать случай, когда замена макроса увеличивает длину строки за 100
  3. Вам нужно обрабатывать случаи, когда метка макроса окружена символами. т.е. _MACRO_ - это не то же самое, что MACRO.
2
jman 28 Авг 2011 в 14:26