c - C中的s_strip(s, del)函数,还有比这个更优化的版本吗?

标签 c optimization

我在这里的第一篇文章(很遗憾我没有早点发现这个伟大的社区)。

无论如何,我编写了一个 C 函数,它从字符串 s 中删除字符串 del 中包含的任何字符。我想知道在速度方面是否有改进的余地,特别是对于查找 del 中包含的字符的部分,在 for 循环内(我使用的是 strpbrk(),但 pmg 明智地建议 strchr ()).

也非常欢迎 Bug 猎手!我认为它很强大,但你永远不知道。

这是代码(提前感谢任何答案)...

当前版本

// remove from string s any char contained in string del (return modified s)
// alg:
// parse s via cp1, keep desired *cp1's by copying them via cp2 to the start of s
// null terminate & return the trimmed s

char *s_strip(char *s, const char *del)
{
    char *cp1;                      // for parsing the whole s
    char *cp2;                      // for keeping desired *cp1's

    for (cp1=s, cp2=s; *cp1; cp1++ )
        if ( !strchr(del, *cp1) )   // *cp1 is NOT contained in del (thanks pmg!)
            *cp2++ = *cp1;          // copy it via cp2

    *cp2 = 0;                       // null terminate the trimmed s
    return s;
}

原版

char *s_strip(char *s, const char *del)
{
    char *cp1;                              // for parsing the whole s
    char *cp2;                              // for keeping desired *cp1's

    for (cp1=s, cp2=s; *cp1; cp1++ )
        if ( cp1 != strpbrk(cp1, del) ) {   // *cp1 is NOT contained in del
            *cp2 = *cp1;                    // copy it via cp2
            cp2++;
        }

    *cp2 = 0;                               // null terminate the trimmed s
    return s;
}

最佳答案

strchr() 代替 strpbrk() 怎么样?

当您只需要检查第一个字符时,您的版本不必要地循环输入字符串。

/* ... */
if (!strchr(del, *cp1)) *cp2++ = *cp1;
/* ... */

关于c - C中的s_strip(s, del)函数,还有比这个更优化的版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860892/

相关文章:

c - 打印二维字符数组

C:数组初始化段错误取决于大小和对 printf() 的调用

c - 分析C程序的内存使用情况

c++ - 没有光照计算时我应该忽略顶点法线吗?

c# - 有没有一种有效的方法可以找到集合 S 中元素的所有有序排列,这些元素加起来等于 N?

c - 写入syslog会导致堆分配的大小稳定增加

c - 使用 bfd 数据结构的目标文件中的节数

c++ - 如何优化矩阵乘法 (matmul) 代码以在单个处理器内核上快速运行

css - 使 Angular 应用程序中的背景图像加载速度更快

使用 GCC -O2 选项编译生成不同的程序