0

文字列をインデックスに置き換えたい。xとの間の文字列y。置き換えられる文字列の長さが より短いy場合、ポインターはその差だけインクリメントする必要があります。例えば、

与えられた文字列([10 20]...[10 20]..[30 80]); x = 1(index of [) およびy = 7(index of ]) であり、string-replace が50である場合、 に置き換える必要があります(50...[10 20]..[30 80])

私はそれを試しました:

void replaceindex(char *s, char *replace, unsigned int start, unsigned int end)
{
  assert(start < end);

  char *p = s, *q = s, *r = replace;
  register unsigned int i =  0;
  int found = 0;

  while(*q) {

    if(found == 0 && i == start) {

      found = 1;

      for(; *r; ++r, ++start, ++q)
    *p ++ = *r;

      while(++start < end)
    q++;
    }

    *p ++ = *q ++;   
    i ++;
  }

}

使用:

  char str[] = "([10 20]...[10 20]..[30 80])";
  printf("Before: %s\n", str);
  replaceindex(str, "50", 1, 7);
  printf("After: %s\n", str);

出力は次のとおりです。

Before: ([10 20]...[10 20]..[30 80])
After: (500]...[10 20]..[30 80])0])

しかし、私はこれを期待しています:

Before: ([10 20]...[10 20]..[30 80])
After: (50...[10 20]..[30 80])

これを修正する方法は?

4

3 に答える 3

3

Anon ymous からのアイデアに基づいて構築しますが、新しい文字列の作成を避けます:

void replaceindex(char *s, char *replace, unsigned int start, unsigned int end)
{
  unsigned rl, sl;
  rl = strlen(replace);
  sl = strlen(s);
  ++end; /* change inclusive index to exclusive one */
  assert(start <= end);
  assert(rl <= end - start);
  memcpy(s + start, replace, rl);
  memmove(s + start + rl, s + end, sl - end + 1);
}
于 2012-08-07T22:03:30.017 に答える
0

次の 2 つの修正が必要です。

       for(; *r; ++r, ++start, ++q)
     *p ++ = *r;

-      while(++start < end)
+      while(start++ <= end)
     q++;
     }

     *p ++ = *q ++;
     i ++;
   }
+  *p = '\0';

 }

1 つ目は、終了インデックスが (呼び出しから判断して) 包括的であり、最初に比較して後でインクリメントする必要があるためです。2 つ目は、新しい文字列を終了することです。

の場合は深刻な問題になることに注意してくださいstrlen(replace) > end - start + 1

于 2012-08-07T21:57:18.090 に答える