Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strev()函数在Linux中不可用吗?_C_String - Fatal编程技术网

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

C strev()函数在Linux中不可用吗?,c,string,C,String,我尝试使用strev()编写代码。我包括了,但仍然得到了一个“对strev的未定义引用”错误 我发现strev()根本没有手册页。为什么? Linux不支持strev()?正确。使用以下可用的实现之一: #include <string.h> char *strrev(char *str) { char *p1, *p2; if (! str || ! *str) return str; for (p1 = str, p

我尝试使用
strev()
编写代码。我包括了
,但仍然得到了一个“对
strev
的未定义引用”错误

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

Linux不支持strev()?

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

#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;
}
#包括
char*strev(char*str)
{
字符*p1,*p2;
如果(!str | |!*str)
返回str;
对于(p1=str,p2=str+strlen(str)-1;p2>p1;++p1,--p2)
{
*p1^=*p2;
*p2^=*p1;
*p1^=*p2;
}
返回str;
}
#包括
char*strev(char*str)
{
如果(!str | |!*str)
返回str;
inti=strlen(str)-1,j=0;
char ch;
而(i>j)
{
ch=str[i];
str[i]=str[j];
str[j]=ch;
我--;
j++;
}
返回str;
}

不幸的是,
strev
似乎没有出现在glibc的
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;
}
#定义最大字符数10000
//safe_usub—执行安全无符号减法
尺寸安全(尺寸x,尺寸y){
返回x>y?x-y:y-x;
}
字符*str_反转(常量字符*常量str){
如果(!str){return NULL;}
大小长度=长度(长度,最大字符数);
char*new=malloc(sizeof(char)*len);
尺寸i;
对于(i=0;i
没有用于反转字符串的字符串库函数

strev()
在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);
}
/*
*使用递归反转字符串的C程序
*/
#包括
#包括
无效反向(字符[],整数,整数);
int main()
{
char-str1[20];
整数大小;
printf(“输入要反转的字符串:”);
scanf(“%s”,str1);
大小=strlen(str1);
反向(str1,0,大小-1);
printf(“反转后的字符串是:%s\n”,str1);
返回0;
}
无效反向(字符str1[],整数索引,整数大小)
{
焦炭温度;
temp=str1[索引];
str1[index]=str1[size-index];
str1[尺寸-索引]=温度;
如果(索引==大小/2)
{
回来
}
反向(str1,索引+1,大小);
}

要准确回答您的问题

strev()在Linux上不可用吗?

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

这与系统无关。它是关于您正在使用的C编译器的

参考资料:


请注意,如果使用多字节字符编码(如Big5或任何Unicode编码,尤其是UTF-8),则链接实现将不起作用。但我想大多数strev的实现都是这样的。该实现使用六个解引用。您最多需要四个。解引用通常很便宜,而且像这样的顺序解引用肯定会被编译器优化。除非你的编译器很差劲。@IgnacioVazquez Abrams如果你发现写入
*p1
不会修改实现中的
*p2
,从而允许在读访问中移动赋值以简化它们,那么你应该编写编译器,而不是浪费时间在堆栈溢出上。clang-5.1-O3生成三次读取和三次写入,也许你应该帮他们一把。究竟为什么会有人使用XOR交换技巧?这会让人觉得聪明吗?它只会使代码的可读性比简单地使用临时变量要差,而且在现代超标量无序CPU体系结构上可能会更慢,因为这三条语句具有数据依赖性。我仍然记不起我上次需要反转字符串的时间。你上次接受技术面试是什么时候?这可能是程序员实际需要反转字符串的唯一时间。这可能就是为什么string.h甚至没有一个字符串反转函数,但在一次采访中,他们无论如何都不会让你逃脱库函数的惩罚。好吧,也许你会因为了解库和聪明而获得加分,然后要求你自己实现它。
strev()
的可能重复项不是任何C标准的一部分,但它通常包含在一些库实现中。如果你编写自己的字符串反转函数,如果您没有编写C库实现,请选择另一个名称。以
str
开头的名称和小写字母保留给实现<代码>str_rev可以。这个答案比被选为“最佳”答案的答案可读性强得多。@FehmiNoyanISI它也被破坏了。如果
str
为空,
strlen(str)-1
为垃圾。如果
strlen(str)
大于
INT\u MAX
,您也会遇到问题。@melpomene,用
NULL
指针和空字符串检查更新了答案
strlen()
返回
size\u t
和处理
INT\u MAX
应在库实现中完成。传统上(没有规范)
strev()
执行就地反转。这段代码没有。@Gerhard它最大限度地减少了代码重复,因为每次我想使用它时,我都必须自己复制字符串。我并没有说它比其他代码好,我说我更喜欢它,因为我几乎不希望破坏性操作发生。像我使用的
readln
这样的构造性函数可以就位。这得到了两次投票,持续了18个多月,没有人意识到对strnlen的调用需要两个参数gcc中存在一个字符串函数。gcc i
/*
 * 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);
}