快速C比较

Tre*_*or 5 c comparison substring

作为协议的一部分,我收到以下格式的C字符串:
WORD*WORD
其中两个WORD 都是相同的给定字符串.
并且,* - 是任何可打印字符串,不包括空格!

所以以下都是合法的:

  • WORD asjdfnkn WORD
  • WORD 234kjk2nd32jk WORD

以下是非法的:

  1. WORD akldmWORD
  2. WORD asdm zz WORD
  3. 不料,敬请谅解
  4. 注意,admkas NOTWORD

其中(1)缺少尾随空格; (2)有3个或更多的空格; (3)/(4)不要用正确的字符串(WORD)打开/结束.

当然这可以很直接地实现,但是我不确定我所做的是最有效的.注意:WORD是为整个运行预先设置的,但是可以在运行之间进行更改.

目前我正在对每个字符串反对"WORD".如果手动检查(char-by-char)遍历字符串,则检查第二个空格char.
[如果找到]我然后用"WORD"strcmp(一路).

很想听听你的解决方案,强调效率,因为我将实时运行数百万篇论文.

Die*_*Epp 2

你有简介吗?

这里没有太多收获,因为您正在进行基本的字符串比较。如果您想获得最后百分之几的性能,我会将函数更改str...mem...函数。

char *bufp, *bufe; // pointer to buffer, one past end of buffer
if (bufe - bufp < wordlen * 2 + 2)
    error();
if (memcmp(bufp, word, wordlen) || bufp[wordlen] != ' ')
    error();
bufp += wordlen + 1;
char *datap = bufp;
char *datae = memchr(bufp, ' ', bufe - buf);
if (!datae || bufe - datae < wordlen + 1)
    error();
if (memcmp(datae + 1, word, wordlen))
    error();
// Your data is in the range [datap, datae).
Run Code Online (Sandbox Code Playgroud)

性能提升可能并不那么引人注目。您必须检查缓冲区中的每个字符,因为每个字符都可能是空格,并且分隔符中的任何字符都可能是错误的。将循环更改为memchr很巧妙,但现代编译器知道如何为您做到这一点。更改 astrncmpstrcmptomemcmp也可能可以忽略不计。