不明白为什么 strlen(char*) 有效 [家庭作业]



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

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

这是代码:

#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++ with TDMGCC 编译器 64 位

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

您是第一次使用参数 index = strlen(str) 调用该函数。然后,您正在执行等效于str[-1] str[strlen(str)-1-index]

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

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

"Hello, world!"

最后还有一个额外的字符,即,像这样:

"Hello, world!"

这样做的目的是,例如,strlen函数可以计算字符串的长度,而不会引起分段错误或其他任何错误。它只是循环遍历字符串,当它看到该''字符时,它就知道它已完成。

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

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

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

“ABCCDEDEF”

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

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

myPointer[24]

当 myPointer 是

char* myPointer = “ABC”

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

24*sizeof(*myPointer)

如果你想要边界检查,你可以围绕指针编写自己的包装类,然后传递该(指针,大小)对,覆盖运算符[],并在索引为>=大小时使其引发异常

相关内容

最新更新