0

代码是

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

szubuff 在哪里fetch_query = SELECT NAME FROM TABLE1

szChar 是=

szbuf, szTmp1,szTmp2是字符数组。问题是 szTmp2 仅存储SELECT并忽略其余部分。但我需要完整SELECT NAME FROM TABLE1的内心szTmp2

4

4 回答 4

1

用这个。它将所有字符匹配到行尾:

sscanf(szbuf, "%s %c %[^\n]", szTmp1, &szChar, szTmp2); 
于 2013-08-28T13:26:44.457 回答
1
#include <stdio.h>
#include <string.h>

int main(int argc, const char **argv) {
    char str[] = "fetch_query = SELECT NAME FROM TABLE1";
    char *qry, *sql; 
    qry = strtok(str, "=");
    sql = strtok(0, "=");
    printf("%s -- %s\n", qry, sql);
    return 0;
}

输出:

fetch_query  --  SELECT NAME FROM TABLE1
于 2013-08-28T13:42:52.310 回答
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;
}

“check 1”条件确保从流中提取 2 个单词,第二个单词等于 string "="。“检查 2”确保在之后"="至少还有 1 个单词。

在这种情况下,它输出:
var name: fetch_query
value : SELECT NAME FROM TABLE1

PS:上面的例子需要#include <iostream>and #include <sstream>

于 2013-08-28T13:49:58.687 回答
0

sscanf 中的 %s 一次只读取一个单词,即它在第一个空格处停止。相反,您可以使用以下内容:

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

其中 %[0-9a-zA-Z ] 表示只要在规范中找到输入中的字符(az 是字符范围),就继续阅读。

于 2013-08-28T13:32:17.217 回答