我必须使用一个递归函数,给定一个字符串,表示它是否是回文。
我对这个练习没有任何问题,但我真的不明白为什么这个代码会做出什么要求。特别是,我不知道为什么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位
答案 0 :(得分:2)
在C中,字符串以null结尾。这意味着,比如字符串:
"Hello, world!"
最后有一个额外的字符,即\0
,如下所示:
"Hello, world!\0"
这样做的目的是这样的,例如strlen
函数可以计算字符串的长度,而不会导致分段错误等等。它只是遍历字符串,它知道它在看到'\0'
字符时就完成了。
所以当你说str[strlen(str)]
时,你正在看那个null-terminator,它在某种意义上并不是“字符串的一部分”,但是你确实已经分配了这个内存,所以你的程序没有崩溃。
答案 1 :(得分:2)
您的代码可能会导致异常,并且它按预期工作的事实是纯粹的运气。
您是第一次使用参数index
= strlen(str)
调用该函数。然后,您正在执行str[strlen(str)-1-index]
,相当于str[-1]
。
str[strlen(str)]
总是为空,所以为了使函数成功,字符串之前的字节(不保证是可读的)也必须为空。
显然,这种情况在您的环境中很常见,但当然不可靠。
答案 2 :(得分: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)
如果你想要边界检查,你可以围绕指针编写自己的包装类,然后传递那个(指针,大小)对,覆盖operator []并使其在索引为&gt; = size <时抛出异常/ p>