【问题标题】:Replace one character with multiple characters用多个字符替换一个字符
【发布时间】:2020-07-12 11:23:48
【问题描述】:

我需要将" "(空格)替换为", "(逗号和空格)。 我有接收字符串为 char* 的函数,替换所有这些字符后会在屏幕上打印字符串。

char* PrintComma(char* Text) {
  for (int i = 0; i < strlen(Text); i++) {
    if (Text[i] == ' ') {
        Text[i] = ',';
    }
  }
  return Text;
}

这会将" " 替换为",",但我需要", "。我不允许使用第二个字符串或数组来保存临时数据。我只能使用这一个字符串。

例子:

Input => "Hello world my name is"
Output => "Hello, world, my, name, is"

【问题讨论】:

  • 第1步:计算空格。这是否足够成功,还是您需要更多?
  • 第 2 步:从字符串的末尾向后工作。注意:Text 指向的缓冲区必须足够大以容纳较长的结果字符串。

标签: c string char c-strings


【解决方案1】:

您有两个要求:
1) 必须替换空格。
2)您不能使用另一个字符数组。

这些导致假设输入 char* 必须为所有新的,s 分配足够的空间。

在这种情况下,这会起作用。

char *PrintComma(char *Text) {
  int numberOfSpaces = 0, orignalLength = strlen(Text);
  for (int i = 0; i < strlen(Text); i++) {
    if (Text[i] == ' ')
      numberOfSpaces++;
  }
  for (int i = orignalLength - 1, j = orignalLength + numberOfSpaces - 1; i >= 0; i--) {
    Text[j] = Text[i];
    j--;
    if (Text[i] == ' ') {
      Text[j] = ',';
      j--;
    }
  }
  return Text;
}

【讨论】:

    【解决方案2】:

    根据您的要求:

    我的函数接收字符串为char*,并在替换所有这些字符后在屏幕上打印字符串。

    我不认为您希望用逗号空格替换空格。相反,我认为您想遍历字符串并打印所有字符。遇到空格时,会打印一个额外的逗号。大致方法如下:

    void PrintComma(char *text)
    {
        const size_t len = strlen(text); // don't call on every iteration
    
        for(size_t i = 0; i < len; i++)
        {
            if(text[i] == ' ')
                putchar(',');
    
            putchar(text[i]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是一个工作示例。输入缓冲区必须足够大以存储替换的字符串,因为要求规定不应创建新字符串。

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      void PrintComma(char* Text)
      {
        char* str = Text;
        size_t c, len = strlen(Text);
        for (c = 0; Text[c]; Text[c] == ' ' ? c++ : *Text++);
      
        for (size_t i = 0; i < len + c; i++)
        {
          if (str[i] == ' ')
          {
              str[i] = ',';
              char last = ' ';
              for(size_t u = i + 1; u < len + c; u++)
              {
                  char current = str[u];
                  str[u] = last;
                  last = current;
              }
      
              i += 2;
          }
        }
      }
      
      int main(void)
      {
        char tmp[100] = { 0 };
        const char* TEST = "Hello world my name is";
        memcpy(tmp, TEST, strlen(TEST));
      
        printf("Input: %s\n", tmp);
        PrintComma(tmp);
        printf("Output: %s\n", tmp);
      
        return 0;
      }
      

      结果:

      Input: Hello world my name is
      Output: Hello, world, my, name, is
      

      【讨论】:

      • 抱歉,打错了。不过,我确实想知道为什么您手动复制字符串而不是像其他答案那样使用库函数。
      【解决方案4】:

      这个问题似乎是 memmove() 的完美设置,memmove() 是一个在两个字符串之间复制字节但处理重叠内存块的库函数。

      memmove(
          char_pointer + make_room_at + room_to_make,
          char_pointer + make_room_at,
          init_size - make_room_at + room_to_make
      );
      

      这是使用 memmove() 的应用程序。

      char* PrintComma(char* Text) {
        for (int i = 0; i < strlen(Text); i++) {
          if (Text[i] == ' ') {
            memmove(
                Text + i + 1,
                Text + i,
                strlen(Text) - i + 1
            );
            Text[i++] = ',';
          }
        }
        return Text;
      }
      

      【讨论】:

      • 请记住,这需要逗号已经存在的空间。这有点违反直觉,因为它需要分配所需的空间。
      • memmove 没有“针对重叠字符串进行优化”,它是标准库中唯一可以保证处理它的函数。
      猜你喜欢
      • 1970-01-01
      • 2021-06-08
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 2015-03-15
      • 2013-12-29
      相关资源
      最近更新 更多