看起来当我输出* cp时,它只输出字符串的第一个字母,在我将它们放入向量后,我的输出为空白。我做错了什么?
//write a program to assign the elements from a list of char* pointers to c-style character strings to a vector of strings
#include <iostream>
#include <cstring>
#include <vector>
#include <list>
#include <string>
using namespace std;
int main ()
{
list<const char*> clist;
cout<<"please enter a string"<<endl;
for(string s; getline(cin,s); )
{
const char* cp=s.c_str();
clist.push_back(cp);
cout<<*cp;
}
cout<<*clist.begin();
vector<string> svec;
svec.assign(clist.begin(),clist.end());
for(vector<string>::iterator iter=svec.begin(); iter!=svec.end(); ++iter)
cout<<*iter<<endl;
return 0;
}
答案 0 :(得分:6)
这将打印整个字符串:
cout << cp; // You're providing cout a const char *
这只会打印一个字符:
cout << *cp; // You're providing cout a char
至于你的向量有什么问题,你只存储指向字符串的指针,而不是字符串本身。字符串的内存超出了范围。正如其他人所说,使用std::string
代替原始const char *
。
答案 1 :(得分:4)
cout * cp,它只输出字符串的第一个字母
嗯,*cp
是一个字符(在指针cp
指针所在的位置找到的字符)。所以,是的,它会。
我把它们放在矢量后,我的输出是空白的
令人遗憾的是,你的程序没有完全崩溃,因为你的列表中的指针几乎在你存储它们时就会变成悬空指针。
从一开始就存储std::string
。
答案 2 :(得分:2)
cout<<*cp;
将输出单个字符,因为它指向const char *
你需要这样做:
cout<<cp;
这将输出cp
指向的整个字符串。
答案 3 :(得分:1)
看起来当我cout * cp时,它只输出字符串的第一个字母
*cp
是字符串的第一个字母。 cout << cp
将打印整个字符串。
我把它们放在矢量后,我的输出是空白的。
您的列表包含指向s
内容的指针,该内容仅在循环体内有效。一旦字符串超出范围,指针就会“悬空” - 指向释放的内存。尝试使用指针将给出未定义的行为。
您需要保留字符串本身的副本,方法是将clist
设为list<string>
,或者将字符串保留在另一个容器中,并将指针存储在该数据中clist
中的容器。
或者,您可以使用字符串文字而不是从cin
读取字符串。字符串文字与程序一样长,所以悬挂指针没有问题。
(假设您的代码第一行中的注释是一个您无法更改的规范。否则,我将完全摆脱clist
,并将每个字符串推到{ {1}}当我读到它时。使用指针进行任何操作都不是一个好主意。)
答案 4 :(得分:1)
这里有几个大问题。首先,
const char* cp=s.c_str();
返回指向std :: string中内部成员字符串的指针。更改字符串时,返回的指向c_str的指针引用的值可能会更改(甚至可能在新位置)。因此,列表中的值无效。确保您不使用c_str并尝试在更改原始字符串后使用结果(除非您将c_str结果复制到新的char数组中。
另外,
cout<<*cp;
只打印我们的第一个元素。摆脱*来打印该列表元素的整个c字符串。