0

ここに私のコードがあります:

#include <iostream>
using namespace std;
int countX(char*, char);

int main() {
    char msg[] = "there are four a's in this sentence a a";
    //char *ptr = msg; // <----- question 2!
    cout << countX(msg, 'a');
    cin.get();
}

int countX(char* ptr, char x) {
    int c = 0;
    for (; *ptr; ptr++) {
        if (*ptr == x) c++;
    }
    /*
    while(*ptr) {
        if(*ptr==x) c++;
        ptr++;
    }
    */
    return c;
}

安全な実践と指針に関して、特にいくつかのことを疑問に思っていました。

  1. for-loop での条件ステートメント、; *ptr ;これは安全な方法ですか? 配列の最後の要素のすぐ隣のメモリアドレスに何かが格納されている場合、それはすべて壊れますか? それは可能ですか?いつ終了するかをどのように知るのですか?*ptr容認できないとみなされるのはいつですか?
  2. (メインのコメントアウトに関してchar *ptr = msg;):ポインターと配列は非常に似ていることは理解していますが、実際の配列をcountX渡すこととポインターを渡すことの間に違いはありますか(配列の先頭を指しますか?)。
  3. ではcountX、単純な問題にアプローチするための 2 つの異なる方法を提供しました。一方が他方より優れていると見なされますか?
4

3 に答える 3

0

Q1 : for ループ内の条件ステートメント ; *ptr ;, これは安全な方法ですか? 配列の最後の要素のすぐ隣のメモリアドレスに何かが格納されている場合、それはすべて壊れますか? それは可能ですか?いつ終了するかをどのように知るのですか?*ptr が受け入れられないと見なされるのはいつですか?

回答 : C スタイルの文字列で使用する場合、安全な方法です。C スタイルの文字列は必ず '\0' で終わります。これは基本的に 0 です。'\0' がない場合の動作は未定義です。したがって、ループは文字列の最後で壊れます。*ptr は、C スタイルの文字列以外の場合、決して終了しません。たとえば、C スタイルの「hello」は、実際には「h」、「e」、「l」、「l」、「o」、「\0」を含む配列です。したがって、ループは '\0' に存在し、その後はメモリにアクセスしません。配列の最後の要素の後でメモリにアクセスできます。例えば、

int a[5] = {0,1,2,3,4,5};
int *p = a+5;

p は、配列 a の最後の要素の後の要素にアクセスしています。

Q2 : (メインのコメントアウトされた char *ptr = msg; について): ポインターと配列が非常に似ていることは理解していますが、実際の配列を countX に渡すことと、ポインター (ポイントを指す) を渡すことに違いはありますか配列の先頭に?)。

回答 :配列とポインタはまったく同じではありません。配列名は、配列の最初の要素を指す定数ポインターに他なりません。私が書いた前の例を考えてみましょう。その中で、a[3]、3[a]、*(a+3)、および *(p+3) はすべて同じ要素を参照します。値渡しなので、定数ポインタ msg の値は ptr にコピーされるだけです。だから、いいえ、違いはありません。

Q3 : countX では、単純な問題にアプローチするための 2 つの異なる方法を提供しました。一方が他方より優れていると見なされますか?

回答 :私は専門家ではありませんが、いいえと思います。

また、おそらく cin.get() は必要ありません。

于 2014-03-21T05:33:56.753 に答える
-2

これは非常に悪い習慣です。

条件で行っているforことは、基本的if (*ptr)に、つまり、が指すメモリptrにゼロ以外の値が含まれているかということです。

したがって、文字列の後のメモリ位置にゼロ以外の値 (スペースを使用する別の変数からの可能性があります) またはガベージ値が含まれている場合、ループが無限になるか、誤った値が返される可能性があります。代わりに、ループを 0 から文字列の長さまで実行する必要があります。

于 2014-03-21T04:11:40.953 に答える