在阅读中:如何在不使用计数器的情况下检查数组的元素是否相同?,@ Skizz使用了漂亮的解决方案:
memcmp (&string [0], &string [1], sizeof string [0] * (N - 1))
Run Code Online (Sandbox Code Playgroud)
因此,如果N恰好为1,我们就会得到
memcmp (&string [0], &string [1], 0)
Run Code Online (Sandbox Code Playgroud)
当比较长度为0时,返回值是否确定为0?
测试用例(Cygwin gcc版本4.8.1 windows 64位)返回0.所以我知道这个和其他一些编译器/平台它是0.
printf("%d\n", memcmp("foo", "bar", 0));
Run Code Online (Sandbox Code Playgroud)
C11草案规范如下,但在问题上显得很安静.也许规范的另一部分或某事说了些什么?
7.24.4.1 memcmp函数
提要
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
Run Code Online (Sandbox Code Playgroud)
描述
memcmp函数将s1指向的对象的前n个字符与s2指向的对象的前n个字符进行比较.
返回
memcmp函数返回一个大于,等于或小于零的整数,因为s1指向的对象大于,等于或小于s2指向的对象.
(假设&string [1]没有引用非法内存)
AnT*_*AnT 12
规范的相关部分就是这个
7.21字符串处理
7.21.1字符串函数约定
2如果声明为size_t n的参数指定了函数数组的长度,则在调用该函数时,n的值可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.
这意味着memcmp当提供的序列长度为零时,保证返回零.
| 归档时间: |
|
| 查看次数: |
4024 次 |
| 最近记录: |