C++中sizeof()和strlen()作用于char和string的区别

2021年01月15日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】


从以下3个问题入手:

问题一:
sizeof()返回的长度包括’\0’吗?strlen()返回长度包括’\0’吗?
sizeof()和strlen()的区别在哪里?

问题二:
char a[5]中能放5个字符吗?如果能放,’\0’ 哪里去了?
char a[5]={‘a’,‘b’,‘c’,‘d’,‘e’} 成立吗?如果成立数组a中的结束符在哪里?

问题三:
char *b=“abcde”; 那b可以直接拷贝到一个char a[5]这样的数组中吗?

百见不如一试:

int main() {

    char a[5] = { 'a','b','c','d','e'};
    char b[5] = {0};
    const char* c = "abcde";
    string d = "a";

    // 5 5 8(64位系统下,指针长度为8) 随机(sizeof(string类型)长度不确定,
    // 详见 https://blog.csdn.net/wxqhut/article/details/101375920)
    cout << sizeof(a) << " " << sizeof(b) << " " << sizeof(c) << " " << sizeof(d) << endl;
    // 随机 0 5
    cout << strlen(a) << " " << strlen(b) << " " << strlen(c) << endl;

    return 0;
}

上面3个问题也就迎刃而解了:

问题一: sizeof()包括’\0’,strlen()不包括。区别在于:sizeof 运算符是静态运算符,在编译时就给出了相应的结果,动态内存也就是运行时刻,是不能被sizeof检测的,因此 sizeof(i++) 使用后 i 没有自增;strlen()遇到’\0’(ASCII码是0)会停止。

问题二: 能,没有’\0’。成立,结束符就是’\0’,在哪里不确定。

问题三: 不能,char *b="abcde"会在字符串结束后自动添加1个’\0’,所以字符数组大小至少为6。


参考文献

https://bbs.csdn.net/topics/40369040?list=534202

https://blog.csdn.net/wxqhut/article/details/101375920

你可能感兴趣的:(研究生生活——C++基础,c++,字符串,sizeof,strlen)