-1
#include <iostream>
#include <string.h>
#include <stdlib.h>

using namespace std;

class STRING {
    private:
        char *S[10];
    public:
        STRING();
        void set_str(int n, const char* str1);
        char* get_str(int n);
};

STRING :: STRING(){
    for (int i=0; (i < 9); i ++ ){
        S[i] = '\0';
        cout <<  S[i];
    }

}
void STRING :: set_str(int n,const char*str1) {
    S[n] = (char*)malloc(strlen(str1 + 1));
    strcpy(S[n], str1);
    cout << S[n];
}
char* STRING :: get_str(int n){
    return S[n];
}

int main () {

    cout << " Init \n";
    STRING* str = new STRING();
    cout << "Error \n";
return 0;

このプログラムは正常にコンパイルされ、実行されますが、実行すると、オブジェクトSTRING* str = new STRING();の初期化の前にのみ機能します。. したがって、この場合はエラーメッセージが表示されません。誰かが私の間違いを指摘してくれませんか?文字列の配列を初期化するより良い方法があれば、喜んでお知らせします。

私の目標は、文字列の配列を初期化することです。そして、最初に配列全体の値を NULL に設定します。よろしく

4

2 に答える 2

2

STRING が「10 個の文字列のコレクション」を意味すると仮定すると、それがコンストラクターになります。NULL ポインターではなく、文字 '\0' の値にポインターを設定しています。char 型を char* 型に割り当てています。これでうまくいくかもしれませんが、cout ステートメントがあります。そして、ポインターを DEREFERENCE しようとします。しかし、ポインターはメモリ内の '\0' がどこにあるかを指しており、その時点ではヌル文字ではありません。

編集:OPの質問に応えて、10個の空の文字配列に初期化するために行うべきだと思う方法は次のとおりです。コンストラクターは次のように変更されます。

STRING :: STRING(){
    for (int i=0; i < 10; i ++ ){ // changed to 10.  9 would miss the 10th element
        S[i] = new char[1]; // Length-1 char array
        S[i][0] = 0; // or '/0' or whatever
        cout <<  S[i];  // Prints nothing
    }
}

また、メモリを解放するにはデストラクタが必要です。

STRING::STRING~() { for(int i = 0; i < 10; i++) { delete [] S[i]; }

そして、「set」メソッドを「malloc」ではなく「new」を使用するように変更します。または、すべてmallocして解放します。しかし、それらを混ぜないでください。また、単に削除するのではなく、「配列の削除」を使用することを忘れないでください。

そしてFTLOG、このリンクにアクセスしてブックマークしてください。組み込みの文字列クラスを使用します。

于 2012-04-09T21:57:05.887 に答える
0

メンバーの正しい宣言は次のとおりです。

 char S[10];   

あなたがそれを持っている方法

 char *S[10];

10 の配列を宣言しchar *ます。したがって、 を実行すると、 へのポインタである がS[i] = '\0';初期化され、これはおそらく NULL になるため、基本的には次の行で呼び出します。S[i]char'\0'cout << NULL

于 2012-04-09T21:54:48.850 に答える