- 论坛徽章:
- 0
|
请看下面的一段程序:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
string test_str;
test_str[0] = 'a';
test_str[1] = 'b';
test_str[2] = 'c' ;
test_str[3] = 'd' ;
printf("char array output:%s\n",test_str.c_str());
cout << "string output:" << test_str << endl;
cout << "the string length: " << test_str.length() << endl;
return 0 ;
}
在linux gcc4.1.2编译运行的结果是:
$ ./a.out
char array output:abcdNAK //结尾的NAK是出现在上标位置的,不知什么意思
string output:
the string length: 0
gdb跟踪四步赋值操作的结果:
test_str分别为
"","a","ab","abc","abcd\025" .
也就是说其实test_str是被初始化了的,因为test_str.c_str()能够输出正确的结果,但为什么直接cout没有任何的输出,而 test_str.length()返回为0?是不是这种略带强暴色彩的赋值方式没有付给string以串结束标志,导致cout和求长度的操作因无法找到结束符而将其认为是空串?如果是这样的话,那么只分配内存空间尚未赋值的string对象的对应地址空间里存的是什么?
此外,gdb跟踪时发现当string的长度超过3时,程序会自动的在string串结尾加上'\0',也就是说string重新自动分配了内存,并增加了字符串结束标志。但此时运行上述程序,仍然不能采用cout输出。但gdb跟踪时出现这样的string对象
“abcd\025",为什么会有结尾的"25"?
被问题搞的很头晕,请大牛们指点。
ps:我需要对字符串的某些位进行初始化,但因为字符串是长度可变的,所以才使用了string,各位有没有其他更好的方法? 谢谢 |
|