#include<iostream>
#include<cassert>
using namespace std;
int strlen1(const char* src)
{
assert(src != NULL);
int len = 0;
while (*src++ != '\0')
len++;
return len;
}
int strlen2(const char* src)
{
assert(src != NULL);
const char* temp = src;
while (*src++ != '\0');
return src - temp - 1;
}
int main()
{
char p[] = "Hello";
cout << "use strlen1:" <<strlen1(p) <<endl;
cout << "use strlen2:" <<strlen2(p)<< endl;
return 0;
}
以上是strl的两种方法,第二种效率比第一种高,因为每次循环只需要一次自增,而前者需要两次。
while (*src++ != ‘\0’);
return src - temp - 1;
开始对这个有一些疑问,调试就可以发现
跳出循环之后,temp的指向是0x0136fa60,而src的指向是0x0136fa66. 所以最后算字符串长度的时候要减一。
这种先判断在自增的,过程大概是先判断H e l l o都不等于’\0’,这时候的地址已经到了0x0136fa64,然后src再往后走一个到了’\0’,地址0x0136fa65,然后判断了==’\0’就跳出循环,这时候再自增,就到了0x0136fa66.
这样写可能容易理解一些
while (*src != ‘\0’)
{
src++;
}
return src - temp;
这个就不用减一了