在不使用指针的情况下反转字符串

时间:2015-03-30 23:45:32

标签: c string

我应该将char orig[]复制到char reversed[]并将其反转。我的函数有效,但没有正确重置字符串,这可以通过空字符串返回先前的测试结果来证明。我该如何解决这个问题?

 void reverse(char orig[], char reversed[]) {
    int lastChar = strlen(orig) - 1;
    int lastCopy = lastChar;

    int i;
    for(i = 0; i < lastChar; i++){

        reversed[lastCopy] = orig[i];
        reversed[i] = orig[lastCopy];
        lastCopy--;

        reversed[lastChar+1] = '\0';
    }

    return ;
}

这是我得到的输出:

Test "software" (Pass, returns: erawtfos)
Test the empty string
Assertion failure
Have:   <erawtfos>
Expect: <>

Test a long string (Pass)
Test a simple palindrome (Pass)
4 assertions: 3 passed 1 failed

3 个答案:

答案 0 :(得分:1)

OP问题:当原始字符串orig的长度为0或1时,永远不会在reversed中设置空字符。

而是创建一个简单的循环,一次拉动1 char

// As `orig` elements are not changed, good C style to make it `const`
void reverse(const char orig[], char reversed[]) {

  // use `size_t` as `int` may be too narrow
  size_t length = strlen(orig);

  size_t i;
  for(i = 0; i < length; i++) {
    reversed[i] = orig[length - i - 1];
  }

  reversed[i] = '\0';
}

如果origreversed可能重叠,则需要临时副本。

void reverse(const char orig[], char reversed[]) {
  size_t length = strlen(orig);
  char tmp[length+1];  // Add 1 because an array of size 0 is UB
  memcpy(tmp, orig, length);

  size_t i;
  for(i = 0; i < length; i++) {
    reversed[i] = tmp[length - i - 1];
  }

  reversed[i] = '\0';
}

答案 1 :(得分:0)

简化:

void reverse(char orig[], char reversed[]) {
    int len = strlen(orig);
    int last = len - 1;

    reversed[len] = '\0';

    for (int i = 0; i < len; i += 1) {
        reversed[last] = orig[i];
        last -= 1;
    }
    return;
}

答案 2 :(得分:-1)

你可以使用内置函数,如string :: rbegin(),string :: rend()

以反向复制字符串。

 string copy(orig.rbegin(),orig.rend());

不要忘记包含&lt; string.h&gt;