0

すべてのMACROSをその値に置き換えるコードを書いています。マクロMAXの値が1000の場合、コードでは1000に置き換える必要があります(MACROSが行の最初の単語である場合、その行ではMACROSは置き換えられない場合を想定しています。その場合は別の方法で処理されます。

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

上記のコードは正しいですか?そして、上記のコードはすべての入力の場合で安定していますか?

4

2 に答える 2

2

少なくとも3つの問題があります。

  1. memmovesizeof(p)は、常に修正される予定のmemmoveを使用するべきではありません(たとえば4)、使用する必要がありますstrlen(line) - (p + strlen(p) - line)
  2. マクロを置き換えると行の長さが100を超える場合に対処する必要があります
  3. マクロラベルが記号で囲まれている場合に対処する必要があります。つまり、_MACRO_はMACROと同じではありません。
于 2011-08-28T14:01:03.663 に答える
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が重要です。もちろん、ラインバッファが実際に十分なスペースを提供していることを確認する必要があります。

于 2011-08-28T14:03:09.497 に答える