7

次のような行をスキャンしたい

"[25, 28] => 34"

私はそれをテストするために小さなプログラムを書きました:

#include <cstdlib>
#include <iostream>

int main() {
        char* line = "[25, 28] => 34";
        char a1[100],  a2[100];
        int i;
        sscanf(line, "[%[^,], %[^\]] => %i", a1, a2, &i);
        std::cout << "a1 = " << a1 <<"\na2 = " << a2 << "\ni = "<<i <<"\n";
        return 0;
}

これをコンパイルすると

warning: unknown escape sequence '\]'

そして出力

a1 = 25
a2 = 28
i = -1073746244

に変更すると

sscanf(line, "[%[^,], %[^]] => %i", a1, a2, &i);

コンパイラの苦情はありませんが、それでも

a1 = 25
a2 = 28
i = -1073746244

問題が 2 番目のトークンにあることはわかっています。

sscanf(line, "[%[^,], %[0123456789]] => %i", a1, a2, &i);

与える

a1 = 25
a2 = 28
i = 34

しかし、2 番目のトークンに終了条件を使用したいと考えています。それ、どうやったら出来るの?

4

5 に答える 5

12

あなたがしたい

sscanf(line, "[%[^,], %[^]]] => %i", a1, a2, &i);

3 つの連続]する文字に注意してください。最初の文字はセット内で一致させたくない文字であり%[、2 番目は で始まるセットを終了し、3 番目は入力内%[の文字と一致します。]

于 2011-04-21T23:01:51.067 に答える
5

他の人が言ったように...あなたがここで何をしたいのか正確にはわかりません...

角かっこの間のものが常に整数であると仮定すると、次のようにすることができます。

int a, b, c;
sscanf(line, "[%d, %d] => %d", &a,&b,&c);

正規表現の使用に固執し、ブラケットの間に一般的なものを渡したい場合は、次のものが必要です。

sscanf(line, "[%[^,], %[^]]] => %d", a1, a2, &i);

]2 番目の正規表現は、最後の を除くすべての文字に一致する必要があります。前にエスケープしようとしていたと思いますが]、これは必要ではなく、コンパイラはそのエスケープを処理する方法がわからないため、エラーをスローしています。

1 つ目は「この文字を文字一致セットに含めないでください」と言っており、2 つ目は文字一致セットを閉じており、3 つ目は入力内の に一致するため]、キャプチャ句には 3 つあります。a2][25, 28] => 34

私があなたの質問を完全に誤解している場合は、明確にしてください。修正できます。

于 2011-04-21T22:54:40.797 に答える
3

あなたの質問は基本的に「]キャラクターをscanfスキャンセットに含める方法」に要約されるようです。それは可能であり、エスケープする必要はありません。特にその目的のために、言語仕様では、文字が開始文字の直後または]開始文字の直後に続く場合、それは閉じ括弧ではなくスキャンセットの一部と見なされると規定されています。したがって、あなたの場合、フォーマット指定子は. 必要ありません。[^]"[%[^,], %[^]]] => %i"\

]2 番目の scanset の後の3 番目の文字を忘れたことを除いて、ほぼ正しいことがわかりました。

于 2011-04-21T23:10:09.177 に答える
0

私には、コンパイラ (または、実際にはライブラリ) のバグのように思えます (ただし、2 つだけでなく、3 つ目の右括弧が必要です)。標準 (C99、§7.19.6.2) によると:

変換指定子が [] または [^] で始まる場合、右角かっこ文字はスキャンリストにあり、次の右角かっこ文字は仕様を終了する一致する右角かっこです。

于 2011-04-21T23:00:53.560 に答える
-2

試してもらえますか

sscanf(line, "[%s, %s] => %d", a1, a2, &i);
于 2011-04-21T22:43:41.680 に答える