Замена подстроки другой строкой в ​​C - PullRequest
0 голосов
/ 28 августа 2011

Я пишу код, чтобы заменить все MACROS на его значение. Если мой макрос MAX имеет значение 1000, А в коде его нужно заменить на 1000. (Я предполагаю случай, когда MACROS - это первое слово в строке, тогда в этой строке MACROS не будет заменен, и в этом случае мы будем обрабатываться по-другому. 1001 *

 //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, я сомневаюсь, что приведенный выше код стабилен и работает правильно.

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

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

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

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

if(strlen(p) != strlen(line)) Почему бы просто не использовать if(p != line) здесь?Это должно быть эквивалентно, легче для понимания и быстрее (strlen сканирует всю строку).

isalnum(...) == 0 Возможно, личное предпочтение, но я бы написал это выражение как !isalnum(...), так как это легче понять.way.

memmove(p+(strlen(destStr)-strlen(srcStr)),p,sizeof(p)); Это выглядит неправильно для меня.Он будет перемещать количество символов в зависимости от размера указателя, что не имеет смысла, и если srcStr длиннее, чем destStr, местом назначения перемещения может быть позиция перед началом буфера строки.Если вы хотите переместить оставшуюся часть строки, чтобы скорректировать измененную длину, попробуйте следующее: memmove(p+strlen(destStr), p+strlen(srcStr), strlen(p+strlen(srcStr)+1); +1 также важно для перемещения нулевого терминатора.Конечно, вам нужно убедиться, что буфер строки действительно обеспечивает достаточно места.

...