コードは
sscanf(szbuf, "%s %c %s", szTmp1, &szChar, szTmp2);
スズバフはどこですかfetch_query = SELECT NAME FROM TABLE1
szChar は=
szbuf
、、szTmp1
はszTmp2
文字配列です。問題は、szTmp2 が保存するだけSELECT
で残りを無視することです。しかし、私は完全なSELECT NAME FROM TABLE1
内部が必要ですszTmp2
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>
です。
これを使って。行末までのすべての文字に一致します。
sscanf(szbuf, "%s %c %[^\n]", szTmp1, &szChar, szTmp2);
sscanf の %s は、一度に 1 単語だけを読み取ります。つまり、最初の空白で停止します。代わりに、次のようなものを使用できます。
sscanf(szbuf, "%s %c %[0-9a-zA-Z ]", szTmp1, &szChar, szTmp2);
ここで、 %[0-9a-zA-Z ] は、入力の文字が仕様にある限り読み続けることを示しています (az は文字の範囲です)。