【发布时间】:2012-10-17 05:25:24
【问题描述】:
我用 C 语言编写了一小段代码来测试 C 语言中的 memcmp() strncmp() strcmp() 函数。
这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *word1="apple",*word2="atoms";
if (strncmp(word1,word2,5)==0)
printf("strncmp result.\n");
if (memcmp(word1,word2,5)==0)
printf("memcmp result.\n");
if (strcmp(word1,word2)==0)
printf("strcmp result.\n");
}
由于我对这三个功能感到困惑,有人可以解释一下它们的区别吗?
我的主要问题是我有一个文件,我在其中标记了它的行,问题是当我标记文件中的“原子”一词时,我必须停止标记过程。
我第一次尝试strcmp(),但不幸的是,当它到达文件中放置“原子”一词的位置时,它并没有停止而是继续,但是当我使用memcmp() 或@987654328 时@它停止了,我很高兴。
但后来我想,如果有一个字符串的前 5 个字母是 a,t,o,m,s 并且后面跟着其他字母会怎样。
不幸的是,我的想法是正确的,因为我使用上面的代码将word1 初始化为“atomsaaaaa”,word2 初始化为原子,memcmp() 和strncmp() 在 if 语句中返回 0。另一方面手strcmp()它没有。看来我必须使用strcmp()。
【问题讨论】:
-
感谢包含源代码。现在,如果您展示您获得的结果和预期的结果,您的问题会更清楚。
-
@PascalCuoq 例如,如果我将 word1 初始化为“atomr”,将 word2 初始化为“atoms”,那么当我运行可执行文件时,包含 memcmp() 的 if 语句永远不会为真。
-
@PascalCuoq.Okay 我找到了问题的答案。
-
@el10780:不,我的意思是手册页。例如,像这样——kernel.org/doc/man-pages/online/pages/man3/memcmp.3.html
-
值得注意的是,memcmp 可以快得多,因为它通常被优化为使用单个加载支持的最大类型,并在其中一个地址对齐后立即存储。所以它实际上一次比较多个字符而不是一个,可能是 8 个字符比较,可能至少 4 个。