• 函数memstr


    大家用了memchr、strchr、strstr之后,有没有想要一个叫memstr的函数?从内存里面找特定的字符串?

    glibc里面没有提供memstr,我这里提供一个吧。验证过的可靠版本:


    //find 'substr' from a fixed-length buffer 
    //('full_data' will be treated as binary data buffer)
    //return NULL if not found
    char* memstr(char* full_data, int full_data_len, char* substr)
    {
        if (full_data == NULL || full_data_len <= 0 || substr == NULL) {
            return NULL;
        }
    
        if (*substr == '\0') {
            return NULL;
        }
    
        int sublen = strlen(substr);
    
        int i;
        char* cur = full_data;
        int last_possible = full_data_len - sublen + 1;
        for (i = 0; i < last_possible; i++) {
            if (*cur == *substr) {
                //assert(full_data_len - i >= sublen);
                if (memcmp(cur, substr, sublen) == 0) {
                    //found
                    return cur;
                }
            }
            cur++;
        }
    
        return NULL;
    }
    

    这个函数调用了memcmp,应该可以利用memcmp的加速能力。


    ps:研究过memcmp的同学应该都知道,memcmp会针对硬件做优化,比如一次比较多个字节什么的。



  • 相关阅读:
    EZOJ #202
    EZOJ #201
    p5156 [USACO18DEC]Sort It Out
    p4363 [九省联考2018]一双木棋chess
    p2150 [NOI2015]寿司晚宴
    p5155 [USACO18DEC]Balance Beam
    p2414 [NOI2011]阿狸的打字机
    实验室断网的解决方案
    人需要看到未来
    门德尔松--罗辑思维
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330364.html
Copyright © 2020-2023  润新知