指向动态声明的cstrings数组的指针

时间:2017-02-07 07:54:56

标签: c++ pointers char

char ** ptr = new char *[3];
ptr[0] = new char [5];
ptr[1] = new char [6];
ptr[2] = new char [7];

cout<<"Enter first array: ";
cin.getline(ptr[0], 5);
cin.getline(ptr[1], 6);
cin.getline(ptr[2], 7);
for (int i=0; i<3; i++){
    cout<<ptr+i<<endl;
}
for (int i=0; i<3; i++){
    delete[] ptr[i];
}

当我运行此代码时,它会提供以下输出:

    Enter first array: name
    0xf99c20
    0xf99c28
    0xf99c30

我实际上想要打印出用户输入。

有人可以告诉我该怎么做吗?

2 个答案:

答案 0 :(得分:0)

ptr+i的类型是char**,而不是char*,因此只是作为指针打印。要将其打印为字符串,请使用ptr[i]char*

那就是说,使用std::vector<std::string>。然后你可以使用string version of std::getline。然后,您可以避免在匹配newdelete,泄漏,处理更长的用户输入,处理不同数量的用户输入行等方面出现许多可能的问题。

此外,请重新考虑您对通常被视为不良做法的使用:using namespace std;endl(这些是解释的链接)。

答案 1 :(得分:0)

当您打印ptr+i时,您对指针概念存在逻辑误解,它会为您提供输入在内存中的实际地址位置

打印您可以使用的指针值:

*(ptr+i)

或:

ptr[i]

另外getline (char* s, streamsize n );输入的最大流大小应该更大,因为当您输入另一个输入时,每个字符序列末尾都有一个空字符'\0'和换行符'\n'

cin.getline(ptr[0], 10);
cin.getline(ptr[1], 10);
cin.getline(ptr[2], 10);

链接到解决方案: https://ideone.com/maSOSs