字符串中’/0’的问题
C++中没有字符串对象,字符串可以看成是字符数组。
字符串和数组的区别:
- 在最后的一个元素"\0"上,它标志着一串字符是否是字符串。
(在内存中,就是根据"\0"来确认字符串,如果找不到就会沿着字符一直找下去。它占用内存空间,但是不计入串长。) - 用字符串初始化字符数组时,"\0"附带在后面与前面的字符一起作为字符数组的元素
注意: 用字符串初始化字符数组时,
系统会在字符数组的末尾自动加上一个字符"\0",因此数组的大小比字符串中实际字符的个数 大。如:sizeof(str1)=strlen(str1) +1;
如果是用字符初始化数组,则一定要把"\0"作为一个元素放在初始值表中,不然就不会成为一个字符串。
char sText[5];
sText[0]='a';
sText[1]='a';
sText[2]='a';
sText[3]='a';
sText[4]='\0';
cout<<sText<<endl;///cout对string输出时,会过滤掉空字符,输出不会被截断。
//这样输出就是4个a
// 如果数组的第五个元素即:
sText[4]='a';
cout<<sText<<endl; //这样输出就是5个a和一堆乱码,甚至跳出系统错误,因为没有字符串结尾符
(原:https://blog.csdn.net/jesse621/article/details/8033183#)
sizeof,strlen(),size(),length()的区别学习
strlen(),size(),length()用于求字符串的长度
sizeof用于求对象的字节大小
1. sizeof
注意:C语言中sizeof()是一个关键字,不是函数,不需要使用头文件,补足知识:
1、跟int, float关键字一样,编译器自动识别他们;
2、千万不要因为它长得像函数,就上它的当;
3、就像getchar()的返回值是个int型而不是char型一样,C中有很多陷阱一样。
数组求长度,用sizeof(数组名)
int arr[] = {1, 2, 3, 4};
sizeof(arr) = 16;
char arr[] = "abc";
sizeof(arr) = 4;
strlen(arr)=3
char arr[] = {'1', '2', '3'};
sizeof(arr) = 3;
strlen(arr)=3
注意:当数组作为函数参数传递当时候,表示当是指针,不能用sizeof(名称),求出来当是计算机字长。
sizeof()计算数据(数组、变量、类型、结构体等)所占空间,用字节数表示。
sizeof是一个运算符,获得保证能容纳实现所建立的最大对象的字节大小。因为sizeof的值在编译时就计算好了,因此sizeof不能用来返回动态分配的内存空间的大小。
PS:关于结构体的sizeof日后补充。
2.strlen()
strlen()是一个函数,它的参数必须是一个字符指针,它返回的是字符串的长度,它跟sizeof在编译时就计算好不同,它是在运行之后才计算出来的。
函数声明:
size_t strlen(const char *str)
函数功能:
从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’.
参数
str – 要计算长度的字符串。
返回值
该函数返回字符串的长度,长度大小不包括'\0'.
3. size()和length()
注意:C++中string成员函数length()等同于size(),返回值包括‘/0’,与C库函数strlen()有着本质的区别,使用时切勿混淆。
这两个函数是用来计算string类对象的长度,假如有一个string对象str,则str.size()和str.length()会返回它们的长度,它们的作用是相同的
函数声明:
//返回string长度,单位字节
size_t length() const noexcept;
//返回string长度,单位字节。作用等同于length()
size_t size() const noexcept;
对比sizeof
和sizeof一样都返回加‘/0’,but!
sizeof()用于返回括号中的对象在内存中分配的大小,这个对象有很多。
而size()和length():用于计算string对象长度的一个成员函数
例如size()函数,它包含在STL中,如下所示:
string s="I love you";
int t=s.size(); //t的值为10
用起来非常的简洁明了。而length()的效果和它是完全一致的,不过它使用的历史更早''
4.countof:
是系统定义的一个宏,求取元素的数组的元素个数
详情在https://msdn.itellyou.cn/查到的。
宏_countof,很好用,作用是可以直接返回静态数组的元素个数。
MSDN上这么介绍这个宏的:
_countof宏:计算静态数组元素的个数。
用法:_countof(array);
所需头文件:<stdlib.h>
示例如下:
#define _UNICODE #include <stdio.h>#include <stdlib.h>#include <tchar.h>int main( void ){ _TCHAR arr[20], *p; printf( “sizeof(arr) = %d bytes/n”, sizeof(arr) ); printf( “_countof(arr) = %d elements/n”, _countof(arr) ); // In C++, the following line would generate a compile-time error: // printf( “%d/n”, _countof§ ); // error C2784 (because p is a pointer) _tcscpy_s( arr, _countof(arr), _T(“a string”) ); // unlike sizeof, _countof works here for both narrow- and wide-character strings}
在VS2005上面输出结果如下:
sizeof(arr) = 40 bytes
_countof(arr) = 20 elements
如果屏蔽掉#define _UNICODE 这句,那么输出结果又是:
sizeof(arr) = 20 bytes
_countof(arr) = 20 elements
(原文:https://blog.csdn.net/md521/article/details/5512836 )