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’作为结尾。