char*到字符串向量的列表
list of char* to vector of strings
当我cout*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;
}
这将打印整个字符串:
cout << cp; // You're providing cout a const char *
这将只打印一个字符:
cout << *cp; // You're providing cout a char
至于向量有什么问题,您只存储指向字符串的指针,而不是字符串本身。字符串的内存已超出范围。正如其他人所说,使用std::string
而不是原始const char *
。
cout*cp,它只输出字符串的第一个字母
*cp
是一个字符(在指针cp
指向的位置上找到的那个字符(。所以,是的,它会的。
在我把它们放进矢量后,我的输出是空白的
不幸的是,你的程序并没有完全崩溃,因为你的列表中的指针几乎在你存储它们的时候就变成了悬空指针。
从一开始就存储std::string
s。
cout<<*cp;
将输出单个字符,因为它指向const char *
你需要做:
cout<<cp;
这将输出cp
指向的整个字符串。
这里有几个大问题。首先,
const char* cp=s.c_str();
返回一个指向std::string中的内部成员字符串的指针。当您更改字符串时,返回的指向c_str的指针所引用的值可能会更改(甚至可能在新位置(。因此,列表中的值无效。确保您没有使用c_str,并在原始字符串更改后尝试使用结果(除非您将c_str结果复制到新的char数组中。
此外,
cout<<*cp;
只打印我们的第一个元素。去掉*以在该列表元素处打印整个c字符串。
看起来当我cout*cp时,它只输出字符串的第一个字母
*cp
是字符串的第一个字母。cout << cp
将打印整个字符串。
在我把它们放在向量中之后,我的输出是空白的。
您的列表包含指向s
内容的指针,该指针仅在循环的正文中有效。一旦字符串超出范围,指针就会"悬空"——指向已释放的内存。尝试使用指针会产生未定义的行为。
您需要保留字符串本身的副本,方法是将clist
设为list<string>
,或者将字符串保留在另一个容器中,并将指向该容器中数据的指针存储在clist
中。
或者,您可以使用字符串文字,而不是从cin
中读取字符串。字符串文字和程序一样长,所以悬挂指针没有问题。
(这是假设代码第一行中的注释是一个不能更改的规范。否则,我会完全去掉clist
,并在阅读时将每个字符串推到svec
的背面。对任何内容使用指针都不是一个好主意。(
- 访问列表向量中的结构
- 从列表向量中删除无法按预期工作
- 从列表/向量制作嵌套 for 循环的最佳方法是什么?
- 在 c++ 中访问列表向量时出现问题
- 指向列表向量中的第n个元素
- 当迭代器添加到添加到列表向量的结构时,迭代器停止指向值?
- 如何将 for 循环中的每个迭代都放入列表/向量中?(C++)
- 删除列表向量中的元素并显示当前列表
- 如何与可以在列表/向量中使用的成员进行类型的类型
- 通过列表向量循环
- 如何使用C 创建多列列表/向量
- 存储动态创建对象的列表/向量的最佳方法是什么
- 基本STL:向量列表或列表向量,在这种特殊情况下哪个会更好
- Seg 错误初始化列表向量与控制台输入
- C++ 将文件读入数组/列表/向量
- 初始值设定项列表向量构造函数
- 如何在C++中初始化列表向量
- C++:保持实体列表向量与集合的最佳方式
- 如何将节点添加到列表向量
- 初始化列表向量时出错