1

我必须使用一个递归函数,给定一个字符串,说明它是否是回文。

我对这个练习没有任何问题,但我真的不明白为什么这段代码会按要求做。特别是不知道为什么strlen(char*)函数不会抛出异常(我知道这是一个OOP概念,但我不知道如何解释自己)像IndexOutOfRange

这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
bool IsPalindrome(char str[],int index){
 if (index>0){
    if (str[index]==str[strlen(str)-1-index])
       return IsPalindrome(str,index-1);
    else
       return false;
 }
 else{
    if (str[index]==str[strlen(str)-1])
       return true;
    else
       return false;
 }
}

int main()
{
char A[100]; 
gets(A);
if (IsPalindrome(A,strlen(A)))
    printf("palindrome");
else
    printf("not palindrome");
getch();
return 0;
}

为什么我不必输入:

 if (IsPalindrome(A,strlen(A)-1))

它仍然有效吗?

我在用着!Orwell 的 Dev-C++ 和 TDMGCC 编译器 64 位

4

3 回答 3

2

在 C 中,字符串是以null 结尾的。这意味着,对于字符串:

"Hello, world!"

末尾有一个额外的字符,即\0,如下所示:

"Hello, world!\0"

这样做的目的是,例如该strlen函数可以计算字符串的长度,而不会导致分段错误或其他任何问题。'\0'它只是简单地遍历字符串,当它看到那个字符时它就知道它已经完成了。

因此,当您说 时str[strlen(str)],您正在查看那个空终止符,从某种意义上说,它并不是真正的“字符串的一部分”,但是您确实分配了该内存,因此您的程序不会崩溃。

于 2013-10-28T18:26:34.227 回答
2

您的代码可能会导致异常,它按预期工作的事实纯属运气。

您是第一次使用参数index=调用该函数strlen(str)。然后,你正在做str[strlen(str)-1-index]相当于str[-1].

str[strlen(str)],正如 CmdrMoozy 指出的那样,始终为空,因此要使函数成功,字符串之前的字节(不保证甚至可读)也必须为空。显然这种情况在您的环境中很常见,但它当然不可靠。

于 2013-10-28T18:34:21.413 回答
0

我不确定 strlen(char*) 将如何抛出 IndexOutOfRange 异常所有 strlen(char*) 将做的是获取一个指针,递增指针和一个计数器,直到 *ptr == 0 时它将返回柜台。

其中没有涉及边界的概念。如果你的记忆看起来像

“ABC\0CDE\0DEF\0”

您可以在该缓冲区中的任何位置要求 strlen() ,这将是一个合法的操作

如果您的问题更多的是为什么“越界”指针访问不会导致异常,例如

myPointer[24]

当 myPointer 是

char* myPointer = “ABC”

那是因为在 C/C++ 中指针没有边界检查。myPointer[24] 与 24[myPointer] 相同,这只是意味着获取 myPointer 的值并将其增加

24*sizeof(*myPointer)

如果要进行边界检查,可以围绕指针编写自己的包装类,然后传递 (pointer,size) 对,覆盖 operator[] 并使其在索引 >= size 时抛出异常

于 2013-10-28T18:29:49.187 回答