1

C++ または C# でこれに対するいくつかの回答が見つかりましたが、C の回答はありませんでした。

文字列の文字数を数える方法を知る必要があります。目標は、文字列内に閉じたブロック (中括弧'{', で囲まれている) があるかどうかを判断することです。'}'今、私は次のものを持っています:

int closedBlock(char* value) {
    int open = 0;

    int i;
    for (i = 0; i < strlen(value); i++) {
        if (!strcmp("{", value[i])) {
            open++;
        } else if (!strcmp("}", value[i])) {
            open--;
        }
    }

    return !open;
}

ifしかし、最初のチェックの後にクラッシュします。なぜこれがうまくいかないのか、私にはよくわかりません。悪いポインタと関係があると思いますが(Cでは常に問題になるようです)、それを理解することはできません。作業コードに加えて、私のコードが悪い理由の説明は非常に役立ちます。

ありがとう。

ノート

'{'これは、 の数が の数と等しいことを確認するだけで'}'あり、適切に閉じられたブロックがあることを確認するものではないことを認識しています。この問題を解決したら、その問題を解決します。

4

3 に答える 3

6

strcmpヌルで終わる 2 つの文字列を比較します。あなたのコンパイラが実際には 2 番目のパラメータがchar. 単一の文字を比較したい場合は、 equal-operator を使用してください==:

int closedBlock(char* value) {
    int open = 0;
    int length = strlen(value);
    int i;
    for (i = 0; i < length; i++) {
        if (value[i] == '{') {
            open++;
        } else if (value[i] == '}') {
            open--;
        }
    }

    return !open;
}

ヒント:コンパイラ呼び出しにgccadd-Wall -Wextraを使用すると、有用な警告が表示されることがよくあります。

これは、「{」の数が「}」の数と等しいことを確認するだけであり、適切に閉じられたブロックがあることを確認するものではないことを認識しています。この問題を解決したら、その問題を解決します。

ここでもう 1 つのヒント: 無効なブロックが存在する可能性があるのはいつですか? }先行する start-token なしでend-token が発生した場合に限ります{。このためのすべてのツールが既にありますが、別のifステートメントが不足しています。

于 2012-07-30T14:41:41.353 に答える
2

"{"これは、 string:を単一の character: と比較しようとしているためですvalue[i]

value(おそらく) 文字の配列を指し、value[i]そのうちの 1 つを指定します。したがって、次のように文字間を比較します。

for (i = 0; i < strlen(value); i++) {
    if (value[i] == '{') {
        open++;
    } else if (value[i] == '}') {
        open--;
    }
}

andを重引用符で囲んでいることに注意してください。これは、C 文字列ではなく単一の文字であることをコンパイラに伝えます。{}

于 2012-07-30T14:43:21.883 に答える
0

strcmp()1文字だけを比較する場合になぜ使用するのですか?

あなたは単に==演算子を使うことができます私の例を見てください:

http://ideone.com/dNCH2

よろしくケニー

于 2012-07-30T14:56:40.797 に答える