我在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");
}
有人可以解释我的差异,因为我对这三个功能感到困惑吗?
我的主要问题是我有一个文件,我在其中标记了它的行,问题是当我将文件中的“atoms”字标记时,我必须停止标记化过程。
我首先尝试strcmp()
,但不幸的是,当它达到“原子”这个词放在文件中时它没有停止并继续,但是当我使用memcmp()
时或strncmp()
它停了,我很高兴。
但后来我想,如果有一个字符串,其中前5个字母是a,t,o,m,s,这些字母后面跟着其他字母。
不幸的是,我的想法是正确的,因为我使用上面的代码通过初始化word1
到“atomsaaaaa”和word2
到原子以及memcmp()
和strncmp()
来测试它if语句返回0.另一方面strcmp()
它没有。我似乎必须使用strcmp()
。
答案 0 :(得分:91)
简而言之:
所以,如果你有这些字符串:
const char s1[] = "atoms\0\0\0\0"; // extra null bytes at end
const char s2[] = "atoms\0abc"; // embedded null byte
const char s3[] = "atomsaaa";
然后这些结果成立:
strcmp(s1, s2) == 0 // strcmp stops at null terminator
strcmp(s1, s3) != 0 // Strings are different
strncmp(s1, s3, 5) == 0 // First 5 characters of strings are the same
memcmp(s1, s3, 5) == 0 // First 5 bytes are the same
strncmp(s1, s2, 8) == 0 // Strings are the same up through the null terminator
memcmp(s1, s2, 8) != 0 // First 8 bytes are different
答案 1 :(得分:7)
memcmp
比较了多个字节。
strcmp
等比较字符串。
你在你的例子中作弊,因为你知道两个字符串都是5个字符长(加上空终止符)。但是,如果你不知道琴弦的长度怎么办呢?好吧,你使用strcmp
,因为它知道如何处理字符串,memcmp
没有。
memcmp
就是比较字节序列。如果您知道每个字符串的长度是多少,您可以使用memcmp
来比较它们,但这种情况多久一次?很少。你经常需要字符串比较函数,因为......他们知道字符串是什么以及如何比较它们。
至于您遇到的任何其他问题,您的问题和代码都不清楚。请放心,strcmp
在字符串比较的一般情况下比memcmp
更好。
答案 2 :(得分:4)
答案 3 :(得分:1)
strncmp和memcmp是相同的,除了前者处理NULL终止字符串。
答案 4 :(得分:1)
对于strcmp,你只想比较你知道将成为字符串的内容,但有时情况并非如此,例如读取二进制文件的行,并且你想要使用memcmp来比较某些行的字符串输入包含NUL字符但匹配,您可能希望继续检查更多输入长度。