2013-08-28 41 views
0

代碼空格是包括使用的sscanf

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

其中 szubuff是fetch_query = SELECT NAME FROM TABLE1

szChar是=

szbufszTmp1szTmp2是字符陣列。 問題是,szTmp2僅存儲SELECT而忽略其餘部分。 但我需要完整SELECT NAME FROM TABLE1裏面szTmp2

+3

你確定你用C++編程? – LihO

+0

@ LihO:絕對:) – sajal

+0

看到我的答案明白爲什麼我問這個問題,爲什麼這個評論越來越upvotes :) – LihO

回答

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 
+0

這工作,非常感謝。 – sajal

1

使用此。它匹配所有字符到行末:

sscanf(szbuf, "%s %c %[^\n]", szTmp1, &szChar, szTmp2); 
+0

不。仍然同樣的問題:( 執行查詢SELECT 例外:ORA-00936:缺少表達式 – sajal

+1

@sajal:它的工作原理,請參閱[這個活代碼](http://ideone.com/foLZ5A) – deepmax

+0

@MM。你的代碼在szChar沒有定義的時候工作!! – sajal

0

sscanf中的%s一次只能讀取一個字,即停止在第一個空白處。相反,你可以使用類似以下內容:

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

其中%[0-9A-ZA-Z]說要繼續閱讀,只要在輸入的字符規範中找到(亞利桑那州是一個範圍的字符)。

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>