【问题标题】:Pointer to an array of cstrings declared dynamically指向动态声明的 cstrings 数组的指针
【发布时间】: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&lt;T&gt; 满足您的阵列需求
  • 1.解决什么??? 2.您需要在代码末尾delete[] ptr。 3.你也可以声明char* ptr[3](而不是分配和删除它)。 4. 有更简单、更好和更正确的方法来做你想做的任何事情。

标签: c++ pointers char


【解决方案1】:

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

也就是说,使用std::vector&lt;std::string&gt;。然后您可以使用string version of std::getline。然后,您可以避免许多可能的问题,如匹配 newdelete、泄漏、处理更长的用户输入、处理不同数量的用户输入等。


另外,请重新考虑您对通常被认为是不良做法的使用: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2022-08-16
    • 2021-05-16
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多