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

lymgl2op  于 2023-08-03  发布在  Linux
关注(0)|答案(7)|浏览(177)

我试着用strrev()写代码。我包含了<string.h>,但仍然得到一个“undefined reference to strrev”错误。
我发现strrev()根本没有手册页。为什么?为什么?
Linux不支持strrev()吗?

4szc88ey

4szc88ey1#

正确。使用可用的alternative实现之一:

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

字符串

cbeh67ev

cbeh67ev2#

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

字符串

u91tlkcl

u91tlkcl3#

为了准确回答你的问题

strrev()在Linux上不可用吗?

函数strrev()在string. h库中可用。函数strrev()包括一些其他字符串函数,如strupr(),strlwr(),strrev(),这些函数仅在ANSI C(Turbo C/C++)中可用,而在标准C-GCC编译器中不可用。
这不是体制的问题它是关于你正在使用的C编译器的。
参考文献:
https://discuss.codechef.com/t/is-strrev-function-not-available-in-standard-gcc-compiler/2449
https://www.csestack.org/undefined-reference-to-strrev/

ycl3bljg

ycl3bljg4#

不幸的是,glibc的string.h中似乎没有strrev
显然,我已经迟到了,但我喜欢这个实现。

#define MAX_CHARS 10000
// safe_usub -- perform safe unsigned subtraction
size_t safe_usub (size_t x, size_t y) {
  return x > y ? x - y : y - x ;
}

char* str_reverse (const char* const str) {
  if (!str) { return NULL; }

  size_t len = strnlen(str, MAX_CHARS);
  char*  new = malloc( sizeof(char) * len );

  size_t i;
  for (i = 0; i < len; i++) {
    new[i] = str[ safe_usub(i + 1, len) ];
  }

  new[i] = 0;

  return new;
}

字符串

mnowg1ta

mnowg1ta5#

不如这样:

#include <string.h>

char *strrev(char *s)
{
    if (s && *s) {
        char *b = s, *e = s + strlen(s) - 1;
        while (b < e) {
            char t = *b;
            *b++ = *e;
            *e-- = t;
        }
    }
    return s;
}

字符串

6gpjuf90

6gpjuf906#

没有字符串库函数来反转字符串。
strrev()在Linux的GCC编译器中不存在。创建自己的反向函数:
reverse.c

/*
 * C program to reverse a string using recursion
 */
#include <stdio.h>
#include <string.h>

void reverse(char [], int, int);
int main()
{
    char str1[20];
    int size;

    printf("Enter a string to reverse: ");
    scanf("%s", str1);
    size = strlen(str1);
    reverse(str1, 0, size - 1);
    printf("The string after reversing is: %s\n", str1);
    return 0;
}

void reverse(char str1[], int index, int size)
{
    char temp;

    temp = str1[index];
    str1[index] = str1[size - index];
    str1[size - index] = temp;

    if (index == size / 2)
    {
        return;
    }
    reverse(str1, index + 1, size);
}

字符串

eh57zj3b

eh57zj3b7#

当时我需要在一个给定的点终止源字符串,然后反转:

// terminate and reverse string
char* tstrrev(char* s, int pt)
{
  char *r = malloc( (pt+1) * sizeof(char) );

    s[pt] = r[pt] = '\0';
    s+= pt - 1;

     while ( *s )
      *r++ = *s--;

 return r-pt;
}

字符串

相关问题