代码是
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
答案 0 :(得分:1)
使用它。它将所有字符匹配到行尾:
sscanf(szbuf, "%s %c %[^\n]", szTmp1, &szChar, szTmp2);
答案 1 :(得分: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
答案 2 :(得分: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”确保在"="
之后还有至少1个单词。
var name: fetch_query
value : SELECT NAME FROM TABLE1
PS:上述示例需要#include <iostream>
和#include <sstream>
。
答案 3 :(得分:0)
sscanf中的%s一次只读一个单词,即它在第一个空格处停止。相反,您可以使用以下内容:
sscanf(szbuf, "%s %c %[0-9a-zA-Z ]", szTmp1, &szChar, szTmp2);
其中%[0-9a-zA-Z]表示只要输入中的字符在规范中找到(a-z是一系列字符),就会继续读取。