c++ template 数组长度
/* 求数组长度 (包括char [], int [],double [],...) */
template <class T>
int arrLength(T & arr){
// 实测并不需要额外处理数组长度为0的情况
int n = sizeof(arr)/sizeof(arr[0]);
if((typeid('\0') == typeid(arr[0])) && n && (arr[n-1] == '\0')){
// 如为字符串数组返回的是不包括最后'\0'的长度
--n;
}
return n;
}
/*
对于char ch[] = {'a','b','\0'};
此函数会判断出错为 2
*/
注1-例子:
char chs1[] = {'a','b','c'};//{97,98,99}
strlen(chs1) == 4;
sizeof(chs1)/sizeof(chs1[0]) == 3;
arrLength(chs1) == 3;
char chs2[] = {'\0','b','c'};//{0,98,99}
strlen(chs2) == 0;
sizeof(chs2)/sizeof(chs2[0]) == 3;
arrLength(chs1) == 3;
char chs3[] = {'a','\0','c'};//{97,00,99}
strlen(chs3) == 1;
sizeof(chs3)/sizeof(chs3[0]) == 3;
arrLength(chs1) == 3;
char chs4[] = "0123";
strlen(chs4) == 4;
sizeof(chs4)/sizeof(chs4[0]) == 5;
arrLength(chs1) == 4;
char chs5[] = {97,98,97,0};
strlen(chs4) == 3;
sizeof(chs4)/sizeof(chs4[0]) == 4;
arrLength(chs1) == 3;//此处判断出错!
注2:
char ch[] = "0123\0143";
类似这样里面的’\0’会连着后面的数字识别成一个字符’\012’(8进制);相当于char ch[] = {48,49,50,12,51};
,"0123\x89123"中的\x89同理