2011-11-10 38 views
1

它看起来像当我cout * cp时,它只输出字符串的第一个字母,并且在将它们放入向量之后,我的输出为空。我究竟做错了什么?char *到字符串向量的列表

//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; 
} 
+1

http://codereview.stackexchange.com而不是标记,虽然这不是一个真正的CR问题 –

+1

'COUT << * CP;',当你提领了'cp'变量(使用'*'运算符),你从你的字符串得到一个单一的字符。因此,为了打印整个字符串,你甲肝e传递实际的指针,例如:'cout << cp;'。然而,你应该使用'std :: string'而不是*裸指针*。 – jweyrich

+2

是什么让你知道你应该使用指针?如果你不熟悉C++,你可能会考虑这个伪规则:“如果你使用的是指针,那么你就是在做错了。” –

回答

6

这将打印整个字符串:

cout << cp; // You're providing cout a const char * 

这将只打印一个字符:

cout << *cp; // You're providing cout a char 

至于什么地方错了你的载体,你只存储指向字符串,而不是字符串。字符串的内存已经超出了范围。正如其他人所说,使用std::string而不是原始const char *

+0

哦对。那如果我想的char *的分配给串 – ihm

+0

的矢量我只想使用字符串底部。这只是书中的一个问题。我想弄清楚如何将一个char *列表分配给一个字符串向量。 – ihm

4

COUT * CP,它仅输出串

井的第一个字母,*cp是一个字符(一个在位置发现该指针cp指针)。所以,是的,它会的。

我把他们之后在载体,我的输出是空白

这是不幸的,你的程序没有彻底崩溃,在列表中的指针几乎只要你存储它们成为悬摆指针。

商店std::string从一开始。

+0

我想有字符的列表*第一,然后分配这些C风格字符串串 – ihm

+0

@ihm的载体:为什么呢?这是荒谬的。不要这样做。 –

+0

他们为什么成为悬挂?如果它很烦,我很抱歉。 – ihm

2
cout<<*cp; 

将输出一个字符,因为它指向一个const char *

你需要做的:

cout<<cp; 

这将输出由cp指出整个字符串。

1

它看起来就像当我清点* CP,只输出字符串

*cp的第一个字母是字符串的第一个字母。 cout << cp将打印整个字符串。

我把它们放在向量中后,我的输出是空白的。

您的列表包含指向s内容的指针,该内容仅在循环体内有效。一旦该字符串超出范围,指针就是“悬挂” - 指向释放内存。试图使用指针会导致未定义的行为。

你需要,无论是通过使clist一个list<string>,或通过保持在另一个容器中的字符串,并在clist该容器中存储指向该数据保持保持串本身的副本。

或者,你可以使用字符串文本而不是读字符串从cin。字符串文字与程序一样长,因此悬挂指针没有问题。

(假设你的代码的第一行中的注释是一个你不能改变的规范,否则我会完全清除clist,并且当我阅读时将每个字符串推到svec的背面它,它是很少使用指针任何一个好主意。)

+0

这不是一个家庭作业。我正在读一本书,这是本书中的一个问题。我明白他们为什么现在变得悬崖峭壁。除了有另一个字符串容器并且指针指向它们中的每一个。有没有更好的办法?如果可能的话 – ihm

+0

@ihm:你可以使用字符串文本而不是从'cin'读取字符串:'clist.push_back(“你好!”);'会的工作,没有悬摆指针的问题。但是如果你需要创建并保持一串字符串,那么没有什么比字符串容器更好的了。 –

+0

谢谢。这非常有帮助。顺便说一句。在linux中编写代码的好的txt编辑器是什么?我正在使用gedit。但由于某种原因它变得非常慢。 – ihm

1

在这里你有几个大的问题。首先,

const char* cp=s.c_str(); 

返回一个指向std :: string内部成员字符串的指针。当你改变字符串时,返回的指向c_str的指针引用的值可能会改变(甚至可能在新的位置)。所以,你列表中的值是无效的。请确保您不使用c_str并尝试使用结果的原始字符串已经改变之后,(除非你复制c_str结果到一个新的字符数组。

此外,

cout<<*cp; 

只打印我们的第一个元素,摆脱*打印整个c字符串在这个列表元素上

+0

谢谢我会记住他们。 – ihm