【问题标题】:C++ getting the size of an array of stringsC ++获取字符串数组的大小
【发布时间】:2015-11-27 18:18:01
【问题描述】:

我需要使用一个大小未知的字符串数组。这里我有一个例子,看看是否一切正常。我需要知道 ClassC 中数组的大小,但不将该值作为参数传递。我已经看到了很多方法(这里和谷歌),但正如你现在所看到的,它们没有用。它们返回数组第一个位置的字符数。

void ClassB::SetValue()
{
    std::string *str;
    str = new std::string[2]; // I set 2 to do this example, lately it will be a value from another place
    str[0] ="hello" ;
    str[1] = "how are you";
            var->setStr(str);
}

现在,如果我在 ClassC 中调试,strdesc[0] ="hello" and strdesc[1] = "how are you",所以我想 C 类正在获取信息 ok....

void classC::setStr(const std::string strdesc[])
{
    int a = strdesc->size(); // Returns 5
    int c = sizeof(strdesc)/sizeof(strdesc[0]); // Returns 1 because each sizeof returns 5
    int b=strdesc[0].size(); // returns 5

    std::wstring *descriptions = new std::wstring[?];
}

所以..在classC中,我怎么知道strdesc的数组大小,应该返回2??我也试过:

int i = 0;
while(!strdesc[i].empty()) ++i;

但在i=2 之后,程序因分段错误而崩溃。

谢谢,

使用可能的解决方案进行编辑:

结论:一旦我将数组的指针传递给另一个函数,就无法知道数组的大小

  1. 将大小传递给该函数...或...
  2. 使用带有 std::vector 类的向量。

【问题讨论】:

  • 使用std::vector<string>
  • 没有(标准)方法可以获取您的大小,只有一个指针,您需要自己跟踪它。在指针上执行sizeof 会得到指针的大小(通常在 32 位系统上为 4,在 64 位系统上为 8)。
  • 除非您将其作为已知大小的类型(fx std::vector<string>const std::string strdesc[2])传递,否则您不能。
  • 顺便说一句...“有很多方法可以做到(这里和谷歌),但你现在会看到”......我不知道,我也看不到任何会为代码中的字符串数组工作...只是在编写 c++ 时不要使用 c 样式数组
  • 在不相关的注释上,sizeof(strdesc[0])返回strdesc[0].size()。没有现实的编译器会让sizeof(std::string) 等于 5。通常您有至少 8 个字节(指针大小的两倍,开始和结束或开始和长度)。

标签: c++ arrays string stdstring


【解决方案1】:

我怎么知道strdesc的数组大小

您无法通过指向该数组的指针知道数组的大小。

您可以做的是将大小作为另一个参数传递。或者更好的是,改用向量。

但在 i=2 之后,程序因分段错误而崩溃。

超出数组边界的访问具有未定义的行为。

【讨论】:

  • Accessing beyond the array boundary has undefined behaviour. 这是我想的,但在这里也发现了它作为解决方案,所以我尝试了......然后我明白我也可以传递大小或使用向量,对吗?跨度>
  • 好吧,如果你想傻,你可以要求classC::setStr 的用户必须总是传递一个总是以空字符串结尾的数组。在这种情况下,您的 while 循环将起作用。例如:用户想要传递“hello”和“world”。所以他会用字符串 {"hello","world",""} 创建一个数组。然后,您的循环会发现数组中有 2 个有效字符串,因为第三个是空的。当然,如果函数的用户试图传递一个没有空字符串的数组,或者空字符串应该被视为有效输入,那将会失败。我推荐使用矢量。
【解决方案2】:

使用这种代码,您会遇到内存泄漏和其他类型的 C 风格问题。

使用向量:

    #include <vector>
    #include <string>
    #include <iostream>
    ...
    std::vector<std::string> my_strings;
    my_strings.push_back("Hello");
    my_strings.push_back("World");

    std::cout << "I got "<< my_strings.size() << " strings." << std::endl;

    for (auto& c : my_strings)
            std::cout << c << std::endl;

【讨论】:

  • 那是我的第一个想法,事实上我是用向量做到的,但认为数组会更好......所以我必须将std::vector&lt;std::string&gt; *myvector 作为classc 中的参数传递?
  • 不,只是传递引用或按值传递。 C++11 具有移动语义。 (没有深拷贝)。 C 风格的数组不太好管理。如果你想要一个数组,使用 std::array<:string myfixedsize>.
  • 我也去看看,不知道有一个固定大小的std::array。谢谢
猜你喜欢
  • 2020-07-29
  • 2013-09-14
  • 1970-01-01
  • 2014-04-24
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多