0

コードは

sscanf(szbuf, "%s %c %s", szTmp1, &szChar, szTmp2);

スズバフはどこですかfetch_query = SELECT NAME FROM TABLE1

szChar は=

szbuf、、szTmp1szTmp2文字配列です。問題は、szTmp2 が保存するだけSELECTで残りを無視することです。しかし、私は完全なSELECT NAME FROM TABLE1内部が必要ですszTmp2

4

4 に答える 4

1

C++ を使用しているためstd::string、C スタイルの文字列の代わりに型のオブジェクトを使用することを検討する必要があります。この形式で文字列を解析するには" var = value "、次の方法で文字列ストリームを使用します。

std::istringstream is("fetch_query = SELECT NAME FROM TABLE1");
std::string var, divider, value;
if ((is >> var >> divider) && divider == "=")                          // check 1
{
    std::getline(is, value);
    if (!value.empty())                                                // check 2
        std::cout << "var name: " << var << std::endl
                  << "value :" << value << std::endl;
}

「チェック 1」条件により、ストリームから 2 つの単語が抽出され、2 番目の単語が string と等しいことが保証されます"="。「チェック 2」は、 の後"="に少なくとも 1 つの単語があることを確認します。

この場合、次のように出力されます。
var name: fetch_query
value : SELECT NAME FROM TABLE1

PS: 上記の例では#include <iostream>とが必要#include <sstream>です。

于 2013-08-28T13:49:58.687 に答える
1

これを使って。行末までのすべての文字に一致します。

sscanf(szbuf, "%s %c %[^\n]", szTmp1, &szChar, szTmp2); 
于 2013-08-28T13:26:44.457 に答える
0

sscanf の %s は、一度に 1 単語だけを読み取ります。つまり、最初の空白で停止します。代わりに、次のようなものを使用できます。

sscanf(szbuf, "%s %c %[0-9a-zA-Z ]", szTmp1, &szChar, szTmp2);

ここで、 %[0-9a-zA-Z ] は、入力の文字が仕様​​にある限り読み続けることを示しています (az は文字の範囲です)。

于 2013-08-28T13:32:17.217 に答える