strrev()函数在Linux中不可用吗?

Din*_*esh 32 c string

我试着用代码编写代码strrev().我包括<string.h>但仍然得到一个"未定义的引用strrev"错误.

我发现strrev()根本没有手册页.为什么?

Linux不支持strrev()吗?

Ign*_*ams 36

正确.使用可用的替代实现之一:

#include <string.h>

char *strrev(char *str)
{
      char *p1, *p2;

      if (! str || ! *str)
            return str;
      for (p1 = str, p2 = str + strlen(str) - 1; p2 > p1; ++p1, --p2)
      {
            *p1 ^= *p2;
            *p2 ^= *p1;
            *p1 ^= *p2;
      }
      return str;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么人们会使用XOR交换技巧?它会让人觉得聪明吗?它只是使代码的可读性低于简单地使用临时变量,甚至可能在现代超标量无序CPU架构上更慢,因为这三个语句具有数据依赖性. (36认同)
  • 请注意,如果使用多字节字符编码(例如Big5或任何Unicode编码,特别是UTF-8),链接的实现将无法工作.但我想这适用于大多数`strrev`实现...... (3认同)
  • 伊克.该实现使用六个解引用.你应该需要的最多是四个. (3认同)
  • 解引用通常很便宜,当然这样的顺序解引用会被编译器优化.除非你的编译器很糟糕. (2认同)
  • @IgnacioVazquez-Abrams 如果您发现检测到写入 `*p1` 不会修改实现中的 `*p2` 很简单,允许跨读取访问移动赋值以简化它们,那么您应该编写编译器而不是浪费你在 StackOverflow 上的时间。clang-5.1 -O3 生成三读三写,也许你应该帮他们一把。 (2认同)
  • @Fritz 上次我检查(昨天)时,我测量它比简单地使用临时方法慢 2 倍以上。 (2认同)

Sum*_*aik 23

#include <string.h>

char *strrev(char *str)
{
    if (!str || ! *str)
        return str;

    int i = strlen(str) - 1, j = 0;

    char ch;
    while (i > j)
    {
        ch = str[i];
        str[i] = str[j];
        str[j] = ch;
        i--;
        j++;
    }
    return str;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案比选择作为"最佳"答案的答案更具可读性. (6认同)

Pre*_*eti 6

为了准确回答您的问题,

\n

strrev() 在 Linux 上不可用吗?

\n

string.h 库中提供了 strrev() 函数。函数 strrev() 包括一些其他字符串函数,例如 strupr()、strlwr()、strrev(),这些函数仅在 ANSI C (Turbo C/C++) 中可用,在标准 C-GCC 编译器中不可用。

\n

它\xe2\x80\x99与系统无关。它与您正在使用的 C 编译器有关。

\n

参考:

\n

https://discuss.codechef.com/t/is-strrev-function-not-available-in-standard-gcc-compiler/2449

\n

https://www.csestack.org/undefined-reference-to-strrev/

\n