【问题标题】:List of arrays/pointers c++数组/指针列表 c++
【发布时间】:2013-11-28 22:13:07
【问题描述】:

我正在将 char 数组输入到列表中。这就是我目前所拥有的

list<char*> l; 
char str[50];

cout<<"Enter strings. 0 to stop:\n";
while(1)
{
    cin >> str;
    if(strcmp(str, "0") == 0)
        break;

    l.push_back(str);
}

list<char*>::iterator p;

// display
for(p = l.begin() ; p != l.end(); p++)
    cout<<*p<<endl;

显示循环仅显示最后输入的字符串 n 次。 有没有更好的方法来表示数组列表?

【问题讨论】:

  • 由于无法在 C++ 中复制数组,因此不允许使用数组列表。你有一个指针列表,这根本不是一回事。

标签: c++ arrays list


【解决方案1】:

它完全按照您的要求做!您的列表是char* 的数组,您每次都给它相同的地址。每次循环时,位于该地址的内容都会发生变化...

...甚至不要考虑从函数中返回该列表。列表中的地址只在函数调用范围内有效。

你最好用std::list&lt;std::string&gt;这样的东西

【讨论】:

    【解决方案2】:

    问题在于您总是指向同一个缓冲区str:如果您希望列表包含不同的值,则每个条目都需要不同的缓冲区。当然,这很快就会变得难以管理。因此,最好将 std::string 对象存储在我们的列表中:

    std::list<std::string> l;
    for (std::string tmp; std::cin >> tmp; ) {
        if (tmp == "0") {
            break;
        }
        l.push_back(tmp);
    }
    

    请注意,使用std::cin &gt;&gt; str; 也是非常危险的:没有任何东西可以防止输入溢出缓冲区! 如果您使用带有char 缓冲区的输入运算符,请确保在这样做之前将流的width() 设置为缓冲区的大小(std::setw()&lt;iomanip&gt; 中声明):

    if (std::cin >> std::setw(sizeof(str)) >> str) {
        // ...
    }
    

    当然,您应该在每次输入后检查它确实是成功的。

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2023-03-10
      • 2022-10-07
      • 2017-08-25
      相关资源
      最近更新 更多