c - 在 C 中用 '%20' 替换空格

标签 c arrays string

我试图通过创建一个比实际字符串大的字符数组并就地进行替换来删除字符串的空格。但是,似乎没有正确复制这些值。

我假设您可以执行 char a[7]="aaaa "; 以便您有更多内存来进行替换,但我想我错了。问题是在运行代码并打印 a 之后,我仍然得到相同的字符串 aaaa

注意:请注意,我试图从字符串的末尾开始写入,因此覆盖不是问题。

注意:“测试空间”的预期输出为“test%20space”

int countSpace(char *str) {
        int nSpaces = 0;
        while (*(str) != '\0') {
                if (*(str) == ' ') {
                        nSpaces++;
                }
                str++;
        }
        return nSpaces;
}

int main()
{
  char a[7]="aaaa ";
  int alength = strlen(a);
  int newSize = alength + countSpace(a)*2;
  a[newSize] = '\0';
  newSize--;

  for (int i = alength - 1; i >= 0; i--) {
          if (a[i] == ' ') {
                  a[newSize] = '0';
                  a[newSize - 1] = '2';
                  a[newSize - 2] = '%';
                  newSize -= 3;
          } else {
                  a[newSize] = a[i];
                  newSize--;
          }
  }

  printf("%s", a);

}

最佳答案

我不认为有任何令人满意的方式来执行此操作。我看到你正试图通过从头开始做一些聪明的事情;不幸的是,这并没有真正的帮助。

让我们考虑一下一个小测试用例:字符串"abc def"。无论从头还是尾开始,走到一半都会碰到那个空格,需要用三个字符替换(%20).要实现这一点,您必须让超出该空间的三个角色全部移动到两个角色上方以腾出空间,这很烦人且很难做到。 (从末尾开始实际上更困难,因为那时您需要使字符串的开头向后移动,这将要求您在字符串开头之前有可用空间。如果您继续前进,您至少可以将字符串的末尾移到您分配的超出末尾的空间。)

除非出于某种原因您绝对需要就地执行此操作,否则我强烈建议您使用两个缓冲区。这样会容易得多。

关于c - 在 C 中用 '%20' 替换空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750630/

相关文章:

c - movq 指令出现段错误?

c - 为什么数组有调用约定?

c# - .NET 如何准确比较字符串?

c - 从二进制文件中读取C编程

c - 计算访问位域的哪个元素的宏

c - 如何将 char 数组转换为 float 并检查其范围?

arrays - 需要帮助过滤数组?

javascript - 需要触发通过映射函数reactjs编写的元素数组中的单个元素

javascript - 在 Javascript 中 chop 字符串(有约束)

c++ - 初始化 basic_string C++