版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CV2017/article/details/82982538
不用标准的函数,利用 while 、指针和自增运算符(++) 来求字符串长度
简化版的代码用于日常使用(来自阿里巴巴笔试题),复杂版的代码用于理解过程
复杂版代码:
#include <iostream>
using namespace std;
int fun (char *s)
{
char *p=s;
while(*p++)
{
cout << "*p = " << *--p << endl;
p++;
}
cout << "最后的 p 地址为:" << static_cast<void *> (p) << endl;
cout << "字符 5 的地址为:" << static_cast<void *> (s + 4) << endl;
cout << "字符 5 后的 '\\0' 地址为:" << static_cast<void *> (s + 5) << endl;
cout << "'\\0' 下一个位置地址为:" << static_cast<void *> (s + 6) << endl;
return p-s-1;
}
int main()
{
char *str = "12345";
int length = fun(str);
cout << "length = " << length << endl;
return 0;
}
理解:
- *p++ 等同于 *(p++),因为 * 与 ++ 的优先级相同,并且右结合性
- int a = *p++; //等价于a = *(p++); 即a = *p; p = p + 1;
- 在这个过程中,第一次 *p++ 的值是当前指针指向的值即字符 1,然后再由 ++ 的效果指向下一个值字符 2,下一次循环到 *p++ 时,那么此时 *p++ 的值为字符 2,然后再由 ++ 的效果指向下一个值字符 3,依次类推,当 *p++ 的值是当前指针指向的值即字符 5 时,由 ++ 的效果指向下一个值字符 \0,下一个 while 循环时,当 *p++ 的值是当前指针指向的值即字符 \0 时,由 ++ 的效果指向下一个值字符位置,由于此时 *p++ 的结果是 \0,跳出 while 循环,那么此时的 p 由于 ++ 的效果,是指向 \0 下一个地方
简化版代码:
#include <iostream>
using namespace std;
//求字符串长度的函数
int fun (char *s)
{
char *p=s;
while(*p++);
return p-s-1;
}
int main()
{
char *str = "12345";
int length = fun(str);
cout << "length = " << length << endl;
return 0;
}
参考链接:参考博客