1. 字符串数组的大小如何得到。我们都知道,对于一个字符串数组,要得到它的大小,有多种办法,常见的有下面的两种。
Ⅰ.利用sizeof运算符来实现。现在假设有一个字符数组str[] = “hello,world”,为了得到的它的长度,我们利用这种办法
具体就是sizeof(str) /sizeof(char);结果是12,比较发现,实际的字符串大小事11啊,为什么会得到12的结果呢?
有这种疑问,是因为对我们字符数组没有一个更好的理解。上面初始化一个字符数组,是利用字符串来初始化的,
而字符串的话,默认的是会有一个以null结尾的标志,这个具体的就是’\0’,有很多人的程序有问题,可能都是因为这里
出现了问题,比如数组没有封口,造成了指针非法访问其他内存单元,等等。所以实际上的长度就是12.
具体来说说这个原理吧:sizeof是表示计算大小,即字节数。这里以一个数组名来作为参数,就是计算这个数组的大小。
上面说到,字符串数组的话是有一个默认的null来封口的,所以,计算的大小事包括这个单元的。于是sizeof(str)的大小
就是12 个字节,然后计算一个单元,即一个字符char类型的占据的字节数,也就是1个字节,两者相除,就是12的结果。
Ⅱ.利用循环来实现,这个部分是很多人都常常想到的。因为一个字符串来定义的数组,默认是以null即为的,所以,通过 循环遍历的方式来实现,这个方法还是可行的。定义一个变量i,然后利用for循环,判断str[i]不为’\0’,即可判断 得到最后一个元素的下标,注意到的是这里是最后一个字符元素,但是不是最后一个真正的元素,有一个null,因此,还 要加上1才是真正的个数,经过这个过程,得到的就是总的长度。这个方法比较容易理解。但是容易忽略了最后一个的作用。 实际上,我们使用的很多C提供的函数,关于字符串操作的,都需要用到这个知识,我们在做计算的时候,很容易误以为返 回的。就是那个字符串的长度,从而导致了错误。实际在我们拷贝字符串的时候,尤其要注意这一点。
2. 在《C++ Primer》一书中,将以null结束的字符数组称为字符数组,标准库提供一批处理这类字符数组的函数,包括strlen,strcmp,strcat,strcpy,strncat,strncpy等等,而这些函数中的参数,都是以null结束的字符数组名,也就是字符数组的指针,而得到长度,返回的就是一个长度,没有包括null这个单元,所以实际上,上面的那个还有一个方法,可以调用此函数来实现。当然,还有一点要注意的是,strcat连接函数,将右边的字符串连接到左边,所以对于左边的字符串,一定要准确的计算出长度,如果不慎,就会溢出,出现严重的错误。看看下面这个例子:
Char s1[25] = “hello,world”; char s2[20] = “0123456789012345678”(刚好是20个字符,为何,因为有一个null).所以现在的那个s2[20] = “01234567890123456789”,此时你会发现,字符串就有20个,含有一个null,注意就溢出了,OK。
下面,如果我将上面的那个采用字符串连接函数来做,就是strcat(s1,s2),那么又会出现错误。因为溢出了。
3.C++中提供了一个标准库string来处理字符串,这个string类提供了很多操作,是一种更安全的做法,然而了,为了新旧代码的兼容,需要进行两者之间的转换,而把string的一个类函数c_str()返回值是C风格字符串。const char *str = st2.c_str();其中st2是一个string类型的对象,返回值就是一个指向它的字符串。 此即为字符串的处理,作为C/C++的字符串值得注意的地方。
posted on 2009-12-27 18:48
deercoder 阅读(1342)
评论(0) 编辑 收藏 引用 所属分类:
C/C++