2011-06-07 50 views
3

我閱讀此頁: http://www.opengl.org/wiki/GlGetString爲什麼不能從glGetString(GL_EXTENSIONS)中進行搜索?

例如,如果擴展 GL_EXT_pixel_transform_color_table是 上市,做一個簡單的搜索 GL_EXT_pixel_transform將返回 積極它是否被定義。

如何是可能的,因爲它的空間分開嗎?爲什麼不在你搜索的關鍵字後面放一個空格?

例如:

char *exts = (char *)glGetString(GL_EXTENSIONS); 
if(!strstr(exts, "GL_EXT_pixel_transform ")){ // notice the space! 
    // not supported 
} 

我想知道爲什麼會這樣難道不工作,因爲對我來說它的工作。

回答

3

,如果你要找的擴展列在最後?然後它不會被一個空白。

+0

嗯...認真嗎?即時我確定我之前檢查過...但現在我再次檢查,看起來像沒有空間...!他們到底在想什麼?好吧。然後,我可以自己添加空間。或更好的只是將它們添加到std :: map lol中。 – Rookie 2011-06-07 12:28:50

+3

@Rookie:對於這些問題的典型解決方案是與特定的隔板來標記(一個'」「'在這種情況下),並做在令牌進行比較。 C標準庫有'strtok'這個。 – datenwolf 2011-06-07 13:14:55

+1

@datenwol:strtok的是,不應該被提及,更不用說在C++中使用一個可怕的憎惡。 – 2011-06-07 15:47:35

4

可以使用空格作爲分隔符更可靠的搜索(如果你不想使用新的API)tokenise返回的字符串。例如。與Boost.Tokenizer

typedef boost::tokenizer< boost::char_separator<char> > tokenizer; 

boost::char_separator<char> sep(" "); 
tokenizer tok(static_cast<const char*>(glGetString(GL_EXTENSIONS)), sep); 

if (std::find(tok.begin(), tok.end(), "GL_EXT_pixel_transform") != tok.end()) { 
    // extension found 
} 
+0

你可以用'的std ::發現(tok.begin(),tok.end(), 「GL_EXT_pixel_transform」)!= tok.end'代替,你知道的。 – ybungalobill 2011-06-07 12:55:32

+0

@ybungalobill:* facepalm *我的大腦今天不工作。謝謝。 – 2011-06-07 13:05:59

1

我知道這是一個老問題,但也許別人會覺得它有用。如果你不想使用任何標記庫/類,這裏是一個函數,掃描字符串的確切子字符串(沒有提到的問題)。此外,它幾乎不使用任何額外的內存(字符串數據不會被複制):

bool strstrexact(const char *str, const char *substr, const char *delim, const bool isRecursiveCall = 0) 
{ 
    static int substrLen; 

    if (!isRecursiveCall) 
     substrLen = strlen(substr); 

    if (substrLen <= 0) 
     return FALSE; 

    const char *occurence = strstr(str, substr); 

    if (occurence == NULL) 
     return FALSE; 

    occurence += substrLen; 

    if (*occurence == '\0') 
     return TRUE; 

    const char *nextDelim; 
    nextDelim = strstr(occurence, delim); 

    if (nextDelim == NULL) 
     return FALSE; 

    if (nextDelim == occurence) 
     return TRUE; 

    return strstrexact(nextDelim, substr, delim, TRUE); 
} 

如果子被發現或FALSE,如果不是它返回TRUE。在我的情況下,我使用它的方式如下:

if (strstrexact((const char*) glGetString(GL_EXTENSIONS), "WGL_ARB_pixel_format", " ")) { 
    // extension is available 
} else { 
    // extension isn't available 
} 
相關問題