指向动态声明的 cstrings 数组的指针
Posted
技术标签:
【中文标题】指向动态声明的 cstrings 数组的指针【英文标题】:Pointer to an array of cstrings declared dynamically 【发布时间】:2017-02-07 07:54:55 【问题描述】: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
我实际上希望打印出用户输入。
有人能告诉我怎么做吗?
【问题讨论】:
Err... 解决方法? 您可能想打印ptr[i]
,它与*(ptr+i)
相同。顺便说一句,尽管你最后一个 delete[]..
在一个循环中,你仍然有泄漏。首选std::string
满足您的字符串需求,首选std::vector<T>
满足您的阵列需求
1.解决什么??? 2.您需要在代码末尾delete[] ptr
。 3.你也可以声明char* ptr[3]
(而不是分配和删除它)。 4. 有更简单、更好和更正确的方法来做你想做的任何事情。
【参考方案1】:
ptr+i
的类型是char**
,而不是char*
,所以只是作为指针打印。要将其打印为字符串,请使用ptr[i]
,即char*
。
也就是说,使用std::vector<std::string>
。然后您可以使用string
version of std::getline
。然后,您可以避免许多可能的问题,如匹配 new
和 delete
、泄漏、处理更长的用户输入、处理不同数量的用户输入等。
另外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;
和 endl
(这些是解释链接)。
【讨论】:
@MuhammadIbrahim 如果这是您问题的解决方案,您应该接受答案...【参考方案2】:当您打印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
【讨论】:
以上是关于指向动态声明的 cstrings 数组的指针的主要内容,如果未能解决你的问题,请参考以下文章