无法理解为什么strlen(char *)有效[homework]

时间:2013-10-28 18:22:02

标签: c

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

我对这个练习没有任何问题,但我真的不明白为什么这个代码会做出什么要求。特别是,我不知道为什么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位

3 个答案:

答案 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]

正如CmdrMoozy指出的那样,

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>