2

まず最初に言いたいのは、私はC++初心者で、これは宿題です。また、タイトルで正しい定義を使用しているかどうか確信が持てないので、間違っている場合は修正してください。

null で終わる文字配列の内容を格納する文字列クラスを作成する必要があります。入力の長さが 32 より大きい場合はヒープに格納し、そうでない場合はスタックに格納します。

今、私はコンストラクターで忙しいです:

 #include "SString.h"   
 #include <iostream>

using namespace std;

SString::SString(const char* input)
{
    // Determine length of input
    int length = 0;
    while (input[length] != '\0')
    {
        length++; 
    }
    // Check for zero length
    if (length == 0)
    {
        st_string[1] = ' ';
    }
    // Based on length, make heap string or use stack string
    if(length > 32) 
    {
        int i = 0;
        p_string = new char[length];
        while (i != length) //write string with input
        {
            p_string[i] = input[i];
            i++;
        }
    }
    else 
    {
        int i = 0;
        while(i != length) //write string with input
        {
            st_string[i] = input[i];
            i++;
        }
    }
    cout << "saved string:" << endl;
    cout << p_string << endl;
} 

ここで、メインで次のような文字列を使用して SimpleString を呼び出して、これをテストしました。

 SString("test"); // or something

st_stringまたはのいずれかに文字列を配置して機能しますp_stringが、どちらの場合も、格納された文字列の末尾にはより多くの(奇妙な未定義の)文字があります。したがって、「テスト」の場合は、test#54 などを取得します。

保存された char 配列が入力された char 配列よりも大きくなると思いますが、その理由はわかりません。

4

3 に答える 3

0

あなたのコードにはいくつかの問題があります。まず、正確には次の点です。

// Check for zero length
if (length == 0)
{
    st_string[1] = ' ';
}

? コードの残りの部分がまったく堅牢であれば、空の文字列のケースは自然に処理されます。ここで行っているのは、元の文字列にスペースがある場合にクラスを確実に使用できないようにすることだけです。

質問している特定のエラーが発生する理由については、文字ごとにコピーするときに何をしているのかを考えてください。元の文字列は次のとおりです。

t e s t \0

そしてlength4 です。これは、さらに下のループが 4 文字をローカル配列にコピーすることを意味します。ここでまだ問題が見えますか?

保存されたchar配列が入力されたchar配列よりも大きくなると思いますが、その理由はわかりません。

実際、まったく逆です。ほら、私が省略した部分は、メモリ内の文字列のに来るものです。オリジナルは次のとおりです。

t e s t \0 # # # #

#基本的にランダムなバイトです。文字列は次のようにコピーされます。

t e s t # # # #

\0 をコピーしていないためです。文字列を読み戻すループは、null バイトに到達するまで続行されますが、自分で挿入していないため、それがどこにあるかを知る方法はありません。たまたまメモリにドロップされた場合、次のようになります。

t e s t \54 \0 # # #

その場合、ガベージ文字は 1 つしか取得できませんが、それ以上になる可能性があります。したがって、実際には、意図したよりも長い文字列が保存されていますが、通常の意味ではありません

于 2012-11-07T10:16:16.800 に答える
0

while ループの後、文字を 1 つずつコピーします。この while ループの直後に、変数に文字列の末尾の文字を追加する必要があります。

st_string[i] = '\0';
于 2012-11-07T10:16:38.010 に答える
0

あなたのループは、新しい文字配列内のwhile (i != length)最終的なものをコピーしません。\0それらをに変更する必要があります

while (i <= length) //write string with input
{
    appropriate_string[i] = input[i];
    i++;
}
于 2012-11-07T10:16:00.897 に答える