cin来自用户使用新C ++的字符数组

时间:2014-04-02 19:27:39

标签: c++ class pointers input

我需要创建Title(它是类的数据成员),它是一个可变大小的字符串,它是动态创建的,默认为空字符串。

在一个类中,我创建了一个成员函数setTitle(),提示用户输入标题, 它如下:

Book &setTitle()
{ 
    char *title="";//the array that is supposed to hold the input
    cout << "Title: ";
    cin >> title;//take the input
    Title = new char[strlen(title)+1];//create a char array for Title of size same as title with an additional for '\0'
    assert(Title != 0);
    strcpy(Title, title);//copying content of title to Title
    cout << Title;
    return *this;
}

当我运行它时它没有给我任何错误,但是当我为Title设置一个值时它会停止响应。所以我需要知道如何接受来自用户的输入到一个字符指针(或者不管它叫什么,这里是行cin >> title;)。

2 个答案:

答案 0 :(得分:2)

您正在从输入流中读取字符串文字。这不是一个好主意,因为它会选择以下重载:

basic_istream& operator>>( void*& value );

不应该与C字符串一起使用(应该是const)。

您应该使用std::string代替:

Book& setTitle() {
    std::string title;
    std::cout << "Title: ";
    std::cin >> title;
    Title = title;
    std::cout << Title;
    return *this;
}

答案 1 :(得分:1)

在本声明中

char *title="";//

定义一个指针,该指针指向仅包含终止零的字符串文字。在C ++中,字符串文字具有常量字符数组的类型。所以编写

会更正确
const char *title="";//

即使您将定义没有限定符const的指针,也可能无法更改字符串文字。

有两种方法。要么使用类std::string而不是指针Title,要么在函数读取数据中使用本地字符数组,并根据输入数据的长度分配指针Title并将字符数组复制到其中。例如

Book &setTitle()
{
    const size_t N = 100;
    char title[N]; 

    cout << "Title: ";
    cin.getline( title, N );

    Title = new char[strlen(title)+1];//create a char array for Title of size same as title with an additional for '\0'
    assert(Title != 0);
    strcpy(Title, title);//copying content of title to Title
    cout << Title;
    return *this;
}