我应该在memcmp中处理n吗?

时间:2018-02-16 02:04:31

标签: c memory

  

C库函数int memcmp(const void * str1,const void * str2,size_t n))比较内存区域str1和内存区域str2的前n个字节。

我应该得到strlen(str1)和strlen(str2)的最小值吗?

例如,我有一个由str1指向的内存块和一个字符串str2,我想比较str1_lenstr1内存块和{{1}字节}}

str2

所以我的问题是,我应该确保memcmp(str1, str2, str1_len); // suppose I already have str1_len or memcmp(str1, str2, str1_len < strlen(str2) ? str1_len : strlen(str2)); // should I compare first? memcmp(str1, "ASDF", str1_len); // suppose I already have str1_len or memcmp(str1, "ASDF", 4); // is it safe to just use 4? or memcmp(str1, "ASDF", str1_len < 4 ? str1_len : 4); // should I compare first? 小于要比较的长度吗?

例如,如果n为10,但str1_len为3,如果我执行strlen(str2),是否安全?

或者例如,说memcmp(str1, str2, str1_len)内存块是str1个字节,而18要比较的是str1_len,但我有10 str2 1}}字节,如果我做20,是否安全?

1 个答案:

答案 0 :(得分:1)

  

所以我的问题是我应该确保n小于要比较的长度吗?

不,n 要比较的长度。如果您的意思是考虑将n设置为两个长度中较短的一个,那么这很好,但您仍然需要处理str1str2不同的情况长度和第一个n字节是相等的。例如,memcmp(str1, str2, n)可能会返回0,但您仍需要确定str1str2是否比另一个更长并采取相应行动。

听起来你最好使用strncmp(),它适用于字符串但可以指定长度。所以你可以打电话:

strncmp(str1, str2, str1_len)

以便比较最多str1_len个字符。然后,您必须考虑的唯一额外情况是该调用何时返回0,表示相等,但strlen(str2)大于str1_len