1

私は学校への割り当てを行っていますが、他のキャラクターが配列に含まれていることに問題があるようです。(他の問題の中でも...)

1つの関数で、配列を宣言しました。

const int MAXSIZE = 100;
char inFix[MAXSIZE];

そして、このコードは文字を配列に入れるために使用されます

 //loop to store user input until enter is pressed
    while((inputChar = static_cast<char>(cin.get()))!= '\n')
    {
        //if function to decide if the input should be stored or not
        if(isOperator(inputChar) || isdigit(static_cast<int>(inputChar)) || inputChar == '(' || inputChar == ')')
        {
            inFix[a] = inputChar; //stores input
            a++;
        }

    }

これの最後に、これを行うべきかどうかはわかりませんでしたが、配列にヌル文字を追加します。

 inFix[MAXSIZE] = '\0';

またはstrcat、次の関数で..いずれかの方法を使用する必要がある場合は、strcatを使用して末尾に括弧を追加します。

しかし、コードに問題があったので、forループを実行して、次の関数の先頭でinfix配列内にあるものを出力しました...

そして、私はこの迷惑なビープ音、ハートのような奇妙なキャラクターの文字列、音楽のサインを受け取ります...そして..奇妙なキャラクターの全リスト。何が問題なのですか?ありがとう。

編集:ちなみに、私は入力9*4し、括弧を追加した後にforループを実行するので、出力の最初に次のようになります。

9*4)次に、奇数文字の文字列...

4

4 に答える 4

2

'\0'代わりに、配列内のtoの位置を追加してみてくださいa。つまり、最後に読んだ文字の直後です。それ以外の場合は、文字を配列に配置し、前に配列にあったもののランダムシーケンスを配置し、その後に\0(または、この場合は、配列の終了後のシーケンスになります。これはさらに悪いことです) 。

于 2012-10-02T21:24:13.270 に答える
2

そのため、for ループを実行して、次の関数の先頭で中置配列の内容を出力しました。

そして、私はこの迷惑なビープ音と、ハートや音楽記号のような一連の奇妙な文字を受け取ります...そして..奇妙な文字の全リスト。何が問題なのですか?

問題は、初期化していない配列要素を出力していることです。現在受け入れている回答では、これらすべての要素を初期化するようアドバイスしています。これによりエラーが発生することはありませんが、この回答により、発生した問題を完全に理解できなくなるのは誤りです。

配列の末尾にヌル文字を挿入したコードを再検討してください。

inFix[MAXSIZE] = '\0';

ヌル文字が文字列の末尾をマークすることと関係があることは明らかですが、それを正しく行う方法を間違えています。配列の先頭からヌル文字までのすべてが文字列の一部として扱われます。入力から 3 文字を配列にコピーする場合、9*4これらの 3 文字のみを文字列の一部として表示する必要があります。望ましくないのは、これらの 3 文字を超える配列内のすべてのもの (MAXSIZE まで) も文字列の一部として扱われることです。'\0'そのため、関心のある文字の直後に、文字列の終わりのマーカーである , を配置する必要があります。

(ところで、inFix[MAXSIZE] = '\0';文字列の終わりマーカーを配列の最後に置くだけでなく、配列のに置くことは許可されていません。プログラムは予期しない動作をします。)

inFix[0] = '9';
inFix[1] = '*';
inFix[2] = '4';
inFix[3] = '\0'; // <-- this is where you need to put the end-of-string marker, because this is the end of the characters you care about.

文字列の終わりマーカーを配列の最後に配置すると、効果的にこれが行われます。

inFix[0] = '9';
inFix[1] = '*';
inFix[2] = '4';

inFix[3] = ???
inFix[4] = ???
   .
   .
   .
inFix[98] = ???
inFix[99] = ??? // annoying bell noise? musical note symbol?

inFix[100] = '\0'; // Yes, Please!

配列をすべてゼロに初期化する理由 (これはchar inFix[MAXSIZE] = {};、 a の代わりに空のブレースのように行うこともでき0ます) がうまくいった理由は、気になる文字をどこで書くのをやめても、次の文字が a になることを意味するためです'\0'。気になるキャラクターの直後のその位置だけが重要な場所です。

文字をコピーしているループは停止する場所を正確に認識しているため、文字列の終わりマーカーを挿入する場所も正確に認識しています。シングル'\0'を正しい場所に挿入するのは簡単です。

于 2012-10-02T23:02:26.463 に答える
0

次のように配列を宣言しました。

char inFix[MAXSIZE];

この時点では、配列の内容は初期化されていません。これらの初期化されていない文字を出力すると、表示される動作 (奇妙な文字、音など) が発生します。

ただし、その配列の内容は初期化されません。この配列を初期化する場合は、この行を次のように変更します。

char inFix[MAXSIZE] = {0};

この初期化構文により、配列内の要素が初期化されます。最初の要素は括弧内の値に初期化されますが、括弧内にない値は 0 に初期化されます。上記の場合、すべての配列要素が初期化されます0(たまたま NULL 文字に対応します\0) 。 .

この場合、すべての文字が NULL に初期化されるため、入力の後に null 文字を追加する必要はありません。

とはいえ、より良い解決策は、C スタイルの配列をまったく使用せず、上記で指摘したようにstd::vector<char>、または単にを使用することです。std::string

于 2012-10-02T21:28:37.713 に答える
0

inFix[MAXSIZE] = '\0'現在これが変換されるべきであると理解しているように、文字列をnullで終了すると言いますinFix[MAXSIZE - 1] = '\0'が、この場合、最後の可能な文字で終わった文字列があると言います!! では、どのように何か (たとえば括弧) を追加する必要がありますか?? いっぱいで、これ以上文字を受け入れることができないためです。

したがってinFix[a] = '\0'、文字列の末尾を指すことがわかっているため、これを使用する方が良いかもしれません。文字列a < MAXSIZEに項目を追加するのに十分なスペースがある場合は、それ以外の場合は(たとえばMAXSIZEを使用して) 増加したり、ユーザーにエラーを表示したりできます。 strcat.

于 2012-10-02T22:08:56.290 に答える