簡體   English   中英

無法理解為什么strlen(char *)有效[homework]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM