如何用一个字符替换两个字符?

Posted

技术标签:

【中文标题】如何用一个字符替换两个字符?【英文标题】:How to replace two chars with one char? 【发布时间】:2021-02-26 15:20:40 【问题描述】:

所以我试图在一个句子中用& 替换cc(例如:"Hi this is Mark cc Alice")。到目前为止,我有这段代码,它用& 替换了第一个c,但第二个c 仍然存在。我将如何摆脱第二个c

int main() 
    char str[] = "Hi this is Mark cc Alice";
    int i = 0;
    while (str[i] != '\0') 
        if (str[i] == 'c' && str[i + 1] == 'c') 
            str[i] = '&';  
            //str[i + 1] = ' ';
        
        i++;
    
    printf("\n-------------------------------------");
    printf("\nString After Replacing 'cc' by '&'");
    printf("\n-------------------------------------\n");
    printf("%s\n",str);
    return str;

输入是:

Hi this is Mark cc Alice

输出是:

Hi this is Mark &c Alice

【问题讨论】:

【参考方案1】:

您可以使用通用的“后退”功能将其随机移动到一个位置:

void shunt(char* dest, char* src) 
  while (*dest) 
    *dest = *src;
    ++dest;
    ++src;
  

你可以像这样使用它:

int main()
  char str[] = "Hi this is Mark cc Alice";

  for (int i = 0; str[i]; ++i) 
    if (str[i] == 'c' && str[i+1] == 'c') 
      str[i]='&';

      shunt(&str[i+1], &str[i+2]);
    
  

  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);

  // main() should return a valid int status code (0 = success)
  return 0;

注意从凌乱的 int 声明 + while + 增量转换为一个 for 循环。改用char* 指针会更简单:

for (char* s = str; *s; ++s) 
  if (s[0] == 'c' && s[1] == 'c')
    *s = '&';

    shunt(&s[1], &s[2]);
  

在使用 C 字符串时,熟悉使用指针很重要,因为这可以为您节省很多的麻烦。

您还应该熟悉 C 标准库,这样您就可以使用像 strstr 这样的工具,而不是编写自己的等效工具。这里strstr(str, "cc") 可能会有所帮助。

【讨论】:

你可以使用memmove(str + i + 1, str + i + 2, strlen(str + i + 2) + 1); @chqrlie 不确定memmove 在源/目标重叠的情况下有多安全。 memmove 专门设计用于正确处理重叠区域,这与 memcpy 不同。【参考方案2】:

您必须将整个数组向左移动。一个简单的方法是:

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

#define STR_SIZE 25

int main()
  char str[STR_SIZE] = "Hi this is Mark cc Alice";
  int i=0,j=0;

  while(str[i]!='\0')
    if(str[i]=='c' && str[i+1]=='c') 
      str[i]='&';
      for (j=i+1; j<STR_SIZE-1; j++) /* Shifting the array to the left */
      
          str[j]=str[j+1];
      
    
    i++;
  
  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);
  return 0;

【讨论】:

这里不需要STR_SIZE。如果该字符串变得更长,是否有任何麻烦。【参考方案3】:

在不改变很多代码的情况下,您也可以按照以下方式进行操作

#include <stdio.h>

int main()

  char str[] = "Hi this is Mark cc Alice";
  int i=0;
  while(str[i]!='\0')
  
    if(str[i]=='c' && str[i+1]=='c')
    
      str[i]='&'; 
      // after replacing the first 'c' increment the i, so it will point to next c.
      i++;
      break;
      //str[i+1]=' ';
    
    i++;
  
  // replace previous char with next char until null
  while(str[i]!='\0')
  
      str[i] = str[i+1];
      i++;
  
  printf("\n-------------------------------------");
  printf("\nString After Replacing 'cc' by '&'");
  printf("\n-------------------------------------\n");
  printf("%s\n",str);
  return 0;

【讨论】:

还有@RainbowUnicorn,你在main末尾返回str,这是不正确的,只需使用return 0;【参考方案4】:

您可以使用 2 指方法:使用单独的索引变量来读取和写入同一数组中的字符。

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

int main() 
    char str[] = "Hi this is Mark cc Alice";
    int i = 0, j = 0;

    while (str[i] != '\0') 
        if (str[i] == 'c' && str[i + 1] == 'c') 
            str[j++] = '&';
            i += 2;
         else 
            str[j++] = str[i++];
        
    
    str[j] = '\0';  // set the null terminator that was not copied.

    printf("\n-------------------------------------");
    printf("\nString After Replacing 'cc' by '&'");
    printf("\n-------------------------------------\n");
    printf("%s\n", str);
    return 0;

【讨论】:

以上是关于如何用一个字符替换两个字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何用包含空格的字符串替换列表中的项目?

如何用从一个数据帧到另一个数据帧的值替换字符串

Android - 如何用另一个字符串替换部分字符串?

字符串操作:如何用特定模式替换字符串

C语言中如何用一个字符串替换一个主串中的子串

如何用另一个字符串替换一个字符串的所有实例?