将字符串中的n个字符传递给C中的函数

时间:2015-09-01 03:11:28

标签: c string pointers pointer-arithmetic

我正在测试网址是否包含某些扩展名。我必须这样做大约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;

但是修改了网址

2 个答案:

答案 0 :(得分:4)

您可以采取的步骤:

  1. 在网址中找到'?'

    char* cp = strchr(url, '?');
    
  2. 如果找到它,请将指针向后移动三个。如果您找不到它,请在字符串结尾前将其移动到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);
    
  3. 确保您无法访问'?'之外的任何内容或testExtension中的空字符。

  4. 如果您不确定扩展程序中的字符数,可以使用:

    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);
    }
}

如果你有很多可以测试的扩展,那么可能需要哈希表或其他数据结构来实现良好的性能。