如何替换数组中的子字符串

时间:2019-04-18 20:45:57

标签: c for-loop while-loop

我有一个程序,用另一个数组的内容替换char数组的一部分,但是它也替换了不应替换的部分。

下面的代码是负责替换数组中字符的代码。 一次只能输入一个字符,但是当仅应替换的字符的一部分位于xy的{​​{1}}之类的数组中时,应将其保留,并寻找下一次出现的xyz然后将其替换。

xyz

我的问题是,如果只存在程序要搜索和替换的部分,即使它不是完整的词,它也会替换它。

例如:

如果我想将i =0; while(i < 30){ j=0; while(j < k){ if(carray[i] == aarray[j]) carray[i] = barray[j]; j++; } i++; } 数组中的xyz替换为abc 那么数组具有以下内容:

xyzdefxyzghixy
aarray[] = {xyz}
barray[] = {abc}

我得到carray[] = {xyzdefxyzghixy}作为输出,最后两个字符abcdefabcghiab实际上应保留为ab


我希望输出为xy

我在这里做错了什么。

注意:请注意,我只想使用abcdefabcghixy

非常感谢所有帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

仅在找到完整的子字符串时才需要替换。

有一些有用的标准功能:

  • strstr 允许在字符串中找到子字符串
  • memcpy 可用于将新的子字符串替换为新的子字符串

提案:

#include <stdio.h>
#include <string.h>

int main(int argc, char ** argv)
{
  if (argc != 4)
    printf("usage : %s <str> <old> <new>\n", *argv);
  else {
    char * old = argv[2];
    char * new = argv[3];
    size_t len = strlen(old);

    if (len != strlen(new))
      fprintf(stderr, "'%s' and '%s' do not have the same length\n", old, new);
    else {
      char * str = argv[1];
      char * p = str;

      printf("'%s' -> ", str);

      /* the loop doing the replacements */
      while ((p = strstr(p, old)) != NULL) {
        memcpy(p, new, len);
        p += len;
      }

      printf("'%s'\n", str);
    }
  }

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall r.c
pi@raspberrypi:/tmp $ ./a.out
usage : ./a.out <str> <old> <new>
pi@raspberrypi:/tmp $ ./a.out xyzdefxyzghixy xyz abc
'xyzdefxyzghixy' -> 'abcdefabcghixy'

修改

  

注意:请注意,我只想使用stdio.h

可以是:

#include <stdio.h>

int main(int argc, char ** argv)
{
  if (argc != 4)
    printf("usage : %s <str> <old> <new>\n", *argv);
  else {
    char * old = argv[2];
    char * new = argv[3];
    char * str = argv[1];

    /* check old and new have the same length */
    char * pold, * pnew;

    for (pold = old, pnew = new; *pold && *pnew; ++pold, ++pnew)
      ;

    if (*pold || *pnew)
      fprintf(stderr, "'%s' and '%s' do not have the same length\n", old, new);
    else {
      printf("'%s' -> ", str);

      char * pstr = str;

      /* the loop doing the replacements */
      while (*pstr) {
        /* check if substring */
        char * pold = old;
        char * psubstr = pstr;

        while (*pold && (*pold == *psubstr)) {
          pold += 1;
          psubstr += 1;
        }

        if (*pold == 0) {
          /* substring, replacement */
          pnew = new;

          while (*pnew)
            *pstr++ = *pnew++;
        }
        else
          pstr += 1;
      }

      printf("'%s'\n", str);
    }
  }

  return 0;
}

如您所见,这是一个错误的选择,很容易理解以前版本的功能,而不是那个版本