我试着用strrev()写代码。我包含了<string.h>,但仍然得到一个“undefined reference to strrev”错误。我发现strrev()根本没有手册页。为什么?为什么?Linux不支持strrev()吗?
strrev()
<string.h>
strrev
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; }
字符串
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; }
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/2449https://www.csestack.org/undefined-reference-to-strrev/的
ycl3bljg4#
不幸的是,glibc的string.h中似乎没有strrev。显然,我已经迟到了,但我喜欢这个实现。
string.h
#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; }
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; }
6gpjuf906#
没有字符串库函数来反转字符串。strrev()在Linux的GCC编译器中不存在。创建自己的反向函数:reverse.c:
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); }
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; }
7条答案
按热度按时间4szc88ey1#
正确。使用可用的alternative实现之一:
字符串
cbeh67ev2#
字符串
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/的
ycl3bljg4#
不幸的是,glibc的
string.h
中似乎没有strrev
。显然,我已经迟到了,但我喜欢这个实现。
字符串
mnowg1ta5#
不如这样:
字符串
6gpjuf906#
没有字符串库函数来反转字符串。
strrev()
在Linux的GCC编译器中不存在。创建自己的反向函数:reverse.c
:字符串
eh57zj3b7#
当时我需要在一个给定的点终止源字符串,然后反转:
字符串