【问题标题】:Reversing a string with strrev - C使用 strrev 反转字符串 - C
【发布时间】:2013-06-05 17:21:03
【问题描述】:

我正在尝试使用函数 strrev() 反转字符串。我知道 strrev 返回一个指向反转字符串的指针,所以我只需使用 strrev 函数返回初始化一个与原始字符串大小相同的已分配字符串。显然这不是正确的方法,我在该行中收到“不兼容的类型”错误。

代码如下:

int ispalindrome(int n)
{
   char s[10], sr[10];

   itoa(n, s, 10);

   printf("%s", s);

   sr = strrev(s);

   printf("\nReverse: %s", sr);

   if(strcmp(s, sr) == 0)
       return 1;

   else
       return 0;

}

【问题讨论】:

标签: c string itoa


【解决方案1】:
sr[10];
sr = strrev(s);

这甚至不能编译——数组是不可赋值的。 发布真实代码。

(您需要将sr 声明为char *sr 才能真正编译。)


除此之外,您的问题是strrev() 将字符串反转到位,因此两个字符串将始终比较相等(因为您有效地将反转的字符串与其自身进行比较)。你要做的是:

  • 效率太低的方法:创建字符串的副本,strrev() that,然后 strcmp() 原始和副本。

  • 对非空字符串进行了一些更优化的方法:


int ispal(const char *s)
{
    const char *p = s + strlen(s) - 1;
    while (s < p)
        if (*p-- != *s++)
            return 0;

    return 1;
}

【讨论】:

  • 我认为问题在于代码未编译。好吧,无论如何,我并没有在任何地方看到?
  • 我喜欢代码 sn-p,尽管它不是原始问题的答案。
  • 如果您传入空字符串,则此代码不正确...它表现出未定义的行为。
  • @H2CO3 当 s 为 "" 时,p 将指向 s-1。请参阅stackoverflow.com/questions/16234626/… 的出色第一个答案,为什么这是未定义的行为。
  • @Anonymous 啊,一个接一个。固定。
【解决方案2】:

好的,做了一些研究,看起来strrev 在 Linux 中不可用(如果那是你的平台);查看Is the strrev() function not available in Linux?

您可以使用其中建议的替代实现或使用@H2CO3 的答案。

【讨论】:

    猜你喜欢
    • 2016-08-10
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2017-04-13
    • 2017-02-13
    • 2014-08-13
    相关资源
    最近更新 更多