我正在测试网址是否包含某些扩展名。我必须这样做大约100M次。我正在尝试传递没有查询字符串的URL,因此我可以根据某些条件比较URL中的最后3个字符。
我的问题是,我是否可以仅将http://www.e.com/msusa/DisplayContactPage.jsp
传递给textExtension
?没有在主要内容中修改url
而没有strdup
字符串?
int testExtension(char *url) {
// compare last 3 chars against possible extensions
// return 0 if matches extension, else return 1
return match ? 0 : 1;
}
int main () {
char *url = "http://www.e.com/msusa/DisplayContactPage.jsp?q=string&t=12"
testExtension(url);
}
我当然可以这样做:
if ((end=strchr(url, '?')))
*end=0;
但是修改了网址
答案 0 :(得分:4)
您可以采取的步骤:
在网址中找到'?'
。
char* cp = strchr(url, '?');
如果找到它,请将指针向后移动三个。如果您找不到它,请在字符串结尾前将其移动到3个字符。
检查前一个字符是'.'
。这是扩展的开始。将指针传递给textExtension
。
if ( cp == NULL )
{
len = strlen(url);
cp = url + (len-3);
}
cp -= 3;
if ( *(cp-1) != '.' )
{
// Deal with the condition.
}
// Call textExtension.
testExtension(cp);
确保您无法访问'?'
之外的任何内容或testExtension
中的空字符。
如果您不确定扩展程序中的字符数,可以使用:
char* cp = strchr(url, '?');
if ( cp == NULL )
{
len = strlen(url);
cp = url + len;
}
// Move the pointer back until you find the '.'
while ( *cp != '.' && cp > url )
{
--cp;
}
答案 1 :(得分:2)
有几种方法可以解决这个问题。
选项1:在子字符串上操作
static const int EXTENSION_LEN = 3;
int testExtension(const char *url) {
int pos = index(url, '?');
if (pos > EXTENSION_LEN) {
pos -= EXTENSION_LEN;
return (0 == strncmp(EXTENSION, (url + pos), EXTENSION_LEN));
}
else {
return 0;
}
}
根据您测试相同URL的次数,index()操作的开销(基本URL长度的线性)可能会变得很重要。您可以通过创建扩展程序的副本来避免它(请注意,您不需要strdup()整个URL,但只复制扩展名。)
选项2:将子字符串复制到新缓冲区
int testExtension(const char *extension) {
return (0 == strncmp(EXTENSION, extension, EXTENSION_LEN));
}
int main() {
char ext[EXTENSION_LEN];
char *url = "http://www.e.com/msusa/DisplayContactPage.jsp?q=string&t=12";
int testResult = 0;
int pos = index(url, '?');
if ( pos > EXTENSION_LEN ) {
for ( int idx = 0; idx < EXTENSION_LEN; ++idx ) {
ext[idx] = url[pos - EXTENSION_LEN + idx];
}
ext[EXTENSION_LEN - 1] = 0; // null-terminate
testResult = testExtension(ext);
}
}
如果你有很多可以测试的扩展,那么可能需要哈希表或其他数据结构来实现良好的性能。