如何“部分”比较字符串(返回匹配的字符数)?

时间:2013-05-28 09:54:00

标签: c string algorithm wav

程序适用于.wave文件。

下面的代码是找到“data”子块的程序的一部分。它将所有必要的块写入输出文件,然后找到"data"(将接下来的4个字节复制到char comp_dataID[4];并将其与const char dataID[4] = "data";进行比较):

while(1)  /* finding "data"*/ {
    fread(comp_dataID, 4, 1, input);

    if ( memcmp(comp_dataID, dataID, 4) == 0 ) {
        printf(">>>   \"data\" found!\n");
        fwrite(&comp_dataID, 1, 4, output);
        break;
    }
    else {
        fseek(input, -3, SEEK_CUR);
    }
}

“数据”之前可能有许多扩展子块,所以我想优化程序:

  1. 如果接下来的4个字节包含“....”,则复制下4个字节。 (跳过3次不必要的操作)
  2. 如果“... d”,则fseek(input, -1, SEEK_CUR); / *在“d”之前设置pionter * /然后复制接下来的4个字节。
  3. 如果是“..”,则fseek(input, -2, SEEK_CUR); / *在“d”之前设置pionter * /然后复制接下来的4个字节。
  4. 如果“.dat”,则fseek(input, -3, SEEK_CUR); / *在“d”之前设置pionter * /然后复制接下来的4个字节。
  5. 问题是我不明白如何比较“...... d”和“数据”。即如何找出char comp_dataID[4];是否包含“...... d”或“..da”或“.dat”。


    问题:是否有任何函数执行此操作(返回匹配的字符数:0表示“....”,1表示“...” “等等。)?

    ...或者我将使用for()循环ti找到“d”,然后找到“a”然后“t”。根据结果​​,在“d”之前设置pionter以复制接下来的4个字节(“data”)。

    PS 在这个char [4]之后,接下来的4个字节是所有样本的大小(它在程序中使用)

2 个答案:

答案 0 :(得分:2)

在开始尝试优化之前,您确定这是一个问题吗?你是否真的在一个分析器中运行你的代码,并确定循环的几个额外时钟周期是减慢你的程序的最重要的事情,而不是磁盘I / O,或其他地方发生的事情?

在平均情况下,memcmp可能不会比滚动自己的函数来比较和计算偏移量慢得多,并且与磁盘I / O的影响以及您实际上最终执行的任何处理相比,它可能是最小的贡献

* edit *删除了破碎的例子。


答案 1 :(得分:0)

这个功能可以做到:

int match(char *a, const char *b) {

    int matches = 0;

    if( a[3] == b[0] )  
        matches = 1;
    if( a[2] == b[0] )
        matches = 2;
    if( a[1] == b[0] )
        matches = 3;
    if( a[0] == b[0] )
        matches = 4;

    return matches;
}

int main()
{
    ...
    step = match( buf, dataID ); // number of matched letters
    fseek(input, -step, SEEK_CUR);       // sets `pointer` to the beginning of "data"

    return 0;
}