[英]Can't understand why strlen(char*) works [homework]
我必須使用一個遞歸函數,給定一個字符串,表示它是否是回文。
我對這個練習沒有任何問題,但是我真的不明白為什么這個代碼做了什么問題。 特別是,我不知道為什么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位
在C中,字符串以空值終止 。 這意味着,比如字符串:
"Hello, world!"
最后有一個額外的字符,即\\0
,如下所示:
"Hello, world!\\0"
這樣做的目的是例如strlen
函數可以計算字符串的長度,而不會導致分段錯誤或其他。 它只是循環遍歷字符串,它知道它在看到'\\0'
字符時就完成了。
所以當你說str[strlen(str)]
,你正在看那個null-terminator,它在某種意義上並不是真正的“字符串的一部分”,但你確實已經分配了這個內存,所以你的程序不會崩潰。
您的代碼可能會導致異常,並且它按預期工作的事實是純粹的運氣。
您是第一次使用參數index
= strlen(str)
調用該函數。 然后,你正在做str[strlen(str)-1-index]
,這相當於str[-1]
。
str[strlen(str)]
,正如CmdrMoozy指出的那樣,總是為null,所以為了使函數成功,字符串之前的字節(不保證是可讀的)也必須為空。 顯然,這種情況在您的環境中很常見,但當然不可靠。
我不確定strlen(char *)是如何能夠拋出一個IndexOutOfRange異常所有strlen(char *)都會做一個指針,遞增指針和一個計數器,直到* ptr == 0,此時它將返回計數器。
任何一個都沒有涉及界限的概念。 如果你的記憶看起來像
“ABC\0CDE\0DEF\0”
你可以在緩沖區的任何一點請求strlen(),這將是一個合法的操作
如果你的問題更多的是為什么“out of bounds”指針訪問不會引起異常,就像說的那樣
myPointer[24]
當myPointer是
char* myPointer = “ABC”
那是因為在C / C ++中指針沒有檢查邊界。 myPointer [24]與24 [myPointer]相同,只是意味着獲取myPointer的值並將其增加
24*sizeof(*myPointer)
如果你想要邊界檢查,你可以圍繞一個指針編寫自己的包裝類,然后傳遞那個(指針,大小)對,覆蓋operator []並使它在索引> = size時拋出異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.