C++获取字符串数组的大小

4

我需要使用一个字符串数组,但它的大小未知。这里有一个示例代码,以确保一切正常。但是,我需要在ClassC中获得该数组的大小,而无需将该值作为参数传递。我已经尝试过许多方法(包括在Google上搜索),但是如您现在所看到的,它们都不起作用。它们只返回数组第一个位置中字符的数量。

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"strdesc [1] = "how are you",我认为Class C已经正确获取了信息...
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[?];
}

那么,在C类中,我应该如何知道strdesc的数组大小,应该返回2? 我也尝试过:

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

但是,在i=2之后,程序崩溃并出现分段错误。

谢谢,

可能的解决方案:

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

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

4
请使用 std::vector<string> - 463035818_is_not_a_number
没有(标准)方法可以获取您只有指针的大小,您需要自行跟踪。在指针上执行 sizeof 将给出指针的大小(通常情况下,在 32 位系统上为 4,在 64 位系统上为 8)。 - Some programmer dude
除非您将其作为已知大小的类型传递(例如std::vector<string>const std::string strdesc [2]),否则您无法这样做。 - skyking
1
顺便说一句... "有很多方法可以做到这一点(在这里和谷歌上),但正如你现在所看到的"... 我不知道任何方法,我也没有看到任何适用于您代码中字符串数组的方法... 当您编写C++时,请不要使用C风格的数组。 - 463035818_is_not_a_number
1
另外需要注意的是,sizeof(strdesc[0]) 不会 返回 strdesc[0].size()。现实的编译器也不会使 sizeof(std::string) 等于 5。通常你至少有 8 个字节(指针的两倍大小,开始和结束或开始和长度)。 - MSalters
显示剩余9条评论
2个回答

1

如何知道strdesc数组的大小

您无法从指向该数组的指针中知道数组的大小。

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

但是当i=2时,程序会崩溃并出现分段错误。

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


访问数组边界之外的内容具有未定义的行为。这是我所想的,但在这里也找到了解决方案,所以我尝试了一下...然后我明白了我只需传递大小或使用向量,对吗? - Megasa3
1
如果你想要好玩一点,你可以要求classC::setStr的用户必须始终传递一个以空字符串结尾的数组。这样的话,你的while循环将会起作用。例如:用户想要传递“hello”和“world”。那么他将创建一个由字符串{"hello","world",""}组成的数组。你的循环将会计算出数组中有2个有效字符串,因为第三个是空字符串。当然,如果函数的用户试图传递没有空字符串的数组或者如果空字符串应该被视为有效输入,那么这种方法将会彻底失败。我建议使用vector。 - eerorika

1

使用这种代码会导致内存泄漏和其他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;

那是我的第一个想法,事实上我用向量实现了它,但认为数组会更好...所以我将不得不在类c中将std::vector<std::string> *myvector作为参数传递? - Megasa3
1
不,只需传递引用或按值传递。C++11具有移动语义(无深拷贝)。C风格的数组管理起来不太好。如果您想要一个数组,请使用std::arraystd::string,myfixedsize。 - schorsch_76
我也会看一下,不知道有一个固定大小的std :: array。谢谢。 - Megasa3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接