我读了这个页面: http://www.opengl.org/wiki/GlGetString
例如,如果是扩展名 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
}
我想知道为什么这不起作用,因为对我来说它确实有用。
答案 0 :(得分:4)
您可以使用space作为分隔符来标记返回的字符串,以便更可靠地搜索(如果您不想使用较新的API)。例如。与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
}
答案 1 :(得分:3)
如果您要查找的扩展程序列在最后,该怎么办?然后不会有空白。
答案 2 :(得分: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);
}
如果找到子字符串,则返回TRUE;如果不是,则返回FALSE。在我的情况下这是我如何使用它:
if (strstrexact((const char*) glGetString(GL_EXTENSIONS), "WGL_ARB_pixel_format", " ")) {
// extension is available
} else {
// extension isn't available
}