c - 不使用指针反转字符串

标签 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

最佳答案

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';
}

关于c - 不使用指针反转字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358251/

相关文章:

c++ - SQLite 'Unrecognized token: ":"C++

php - 字符串中最接近特定短语的数字

java - 如果字符已经是java中的数字,则将字符转换为整数

php - php 中的正则表达式- 从字符串中捕获 9 种类型的数字

c - c中单引号中两个字符的用法

c - 禁用 GDB 对 x86 异常的中断

c - 在 Linux 上处理用户输入

c - 在c中初始化unsigned char数组

php - 在 C 中最快重新实现 PHP 的 htmlspecialchars 函数

string - Elixir String.split/3 : how to tell which character was matched