c++ 中的string与char*


前两天写了一个程序,其中一下段是这样的:

char* name;

cout<<"请输入name:";

cin>>name;


当运行的时候出现了段错误。


这样写在编译的时候是通过的,说明语法上是没有什么错误的。

很明显,能从语句上看出,我的意图是想用 name来保存一个字符串 。

但是,name只是一个字符指针,是不能保存字符串的。

这样在运行的时候,很多情况下是会出现段错误的。


后来,有一个地方又出现了一个同样的问题:

使用了一个模板中的 set

set<char *> ss;

char* s;

ifstream fin("file");

if(!fin) return 1;

while(fin>>s) ss.insert(s);

print(ss.begin(),ss.end());//自定义函数 用于显示数集ss中的内容

这样写依然会出现段错误,原因跟上面的一样:字符指针不能用来存放字符串


我做了如下修改:

set<char*>ss;

char s[100];

ifstream fin(file);

if(!fin)return 1;

while(fin>>s) ss.insert(s);

print(ss.begin(),ss.end());


这样写,段错误的问题解决了,但是又出现了新的问题:

每次打印的数据只第一条数据,仅有这一条。

问什么又出现这样的问题呢?

每次插入到ss中的数据都是文件中的以s为首地址的第一条数据。

又由于set数据是不允许重复的,当有重复的数据插入的时候,会自动抛弃。

所以最后ss中只有一条数据。



又修改了一回如下:


set<string> ss;

//set尖括号中的内容是可以为const char*的。

string s;

ifstream fin("file");

if(!fin)return 1;

while(fin>>s) ss.insert(s);

print(ss.begin(),ss.end());


这样写就不会出现上面的诸多问题了。

string 的构造函数 给了一个 p=new char[] 来存放字符串。是比较安全的。


最后:

在c++笔试中会出现的问题:

1.试图使用字符指针来保存字符串。

2.字符数组不一定是字符串,要看是否有‘\0’作为结尾。