1

文字列を指定すると、それが回文かどうかを示す再帰関数を使用する必要があります。

この演習に問題はありませんが、このコードが要求したことを実行する理由が本当にわかりません。特に、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++ と TDMGCC コンパイラ 64 ビット

4

3 に答える 3

2

C では、文字列はnull で終了します。これは、たとえば、文字列について次のことを意味します。

"Hello, world!"

最後に余分な文字があります。つまり\0、次のようになります。

"Hello, world!\0"

これの目的は、たとえば、関数がセグメンテーション違反strlenなどを引き起こすことなく、文字列の長さを計算できるようにすることです。単純に文字列をループし、その文字が表示されると処理が完了したことを認識します。'\0'

したがって、あなたが言うときstr[strlen(str)]、ある意味で実際には「文字列の一部」ではないそのヌルターミネーターを見ていますが、プログラムがクラッシュしないようにそのメモリが割り当てられています。

于 2013-10-28T18:26:34.227 に答える
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)

境界チェックが必要な場合は、ポインターの周りに独自のラッパー クラスを記述し、その (ポインター、サイズ) ペアを渡し、演算子 [] をオーバーライドして、インデックスが >= サイズの場合に例外をスローすることができます。

于 2013-10-28T18:29:49.187 に答える