【问题标题】:How to do a reverse char copy in C++如何在 C++ 中进行反向字符复制
【发布时间】:2015-09-09 19:44:01
【问题描述】:

大家好,我在使用反向复制方法时遇到了一些问题。该方法需要反向复制char*。

char* reverseCopy(char* destination, const char* source, int num)
{
    char placeHolder;
    for (int j=0; j<=num; j++)
    {
        strcpy(destination,source);
    }

    for (int i=0; i<num; num--)
    {
        placeHolder = destination[num];
        destination[i]=placeHolder;
    }
    destination[num]='\0';
    return destination;
}

目标是存储副本的位置。

来源是复制的字符

Num 是数组中的字符数

感谢任何见解。谢谢

【问题讨论】:

  • 你期望什么输出,你得到什么输出,究竟是什么?
  • 老实说,这是为了反转字符串而过于复杂的代码。
  • 为什么strcpy 在循环中???
  • 只需获取指向最后一个字符的指针并向后迭代,复制到输出字符串。注意终止字符。
  • 是的,我认为 OP 不知道循环可以倒退。我假设这是因为对 strcpy 的调用是完全没有必要的(即使它使用不正确)。

标签: c++ copy logic


【解决方案1】:

使用standard library algorithm会是作弊吗?

char* reverseCopy(char* destination, const char* source, int num)
{
    std::reverse_copy(source, source + num, destination);
    destination[num] = '\0';
    return destination;
}

【讨论】:

  • 不幸的是我不能使用标准库。我只能使用 c-strings
  • @GrapeSoda3:您不必更改为std::string,它对作为参数传递的 C 字符串进行操作。如果您不允许使用 &lt;algorithm&gt; 中的函数,那么我想您将不得不重新发明它。这将是不幸的,因为有很多有用的standard library algorithms
  • @GrapeSoda3 看看std::reverse_copy 的示例代码并以此为基础。
【解决方案2】:

但有更简单快捷的方法可以做到这一点: 比如为什么需要循环复制sourcedestination

如果destination == source呢?

还有这个循环:

for (int i=0; i<num; num--)
{
    placeHolder = destination[num];
    destination[i]=placeHolder;
}

写入不正确,即使是正确写入的循环,您也会覆盖destination 中未还原的数据。

我希望这样的事情会起作用(注意source == destination 可能的情况):

char* reverseCopy(char* destination, const char* source, int num) {
    if (destination != source)
    {
        std::copy ( source, source + num - 1, destination );
    }
    std::reverse(destination ,destination + num - 1);
    destination[num-1] = '\0';

    return destination;
}

【讨论】:

  • 这是 UB,因为它会从 0 变为 -1、-2 等等。它会循环 2^31 次
【解决方案3】:

您总是可以将它们转换为字符串,并使用带有复制功能的 source.rbegin()。

【讨论】:

  • 您可能需要详细说明,从技术上讲,它们是字符串,但不是 std::string
【解决方案4】:

我可以将这个函数写成如下:

char* reverseCopy(char* destination, const char* source, int num) {
    char* d = destination;
    while (num) {
        *d++ = source[--num];
    }
    *d = '\0';
    return destination;
}

【讨论】:

  • 如果destination == source ??
  • @AlexLop。这与优化无关。他只想知道如何反转字符串。
  • 那么行为将是未定义的,就像在重叠区域上操作时使用 memcpy 等库函数一样。这是OP问题范围之外的问题。如果需要,则应首先将源复制到临时缓冲区,然后从那里执行向后复制。
  • @Quest 检查destination == source 与优化无关。这是关于输入检查的。
  • @AlexLop。两者兼而有之
【解决方案5】:

将字符串逐个字符地推入 STL 堆栈,然后将字符从堆栈顶部弹出到新字符串中。

它们将被颠倒。

【讨论】:

  • 此解决方案使用额外的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2019-12-09
  • 2021-11-03
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多