【问题标题】:How can I find the size of a (* char) array inside of a function?如何在函数内找到 (* char) 数组的大小?
【发布时间】:2016-03-21 20:13:52
【问题描述】:

我了解如何使用字符串类型数组查找大小:

char * shuffleStrings(string theStrings[])
{
    int sz = 0;
    while(!theStrings[sz].empty())
    {
        sz++;
    }
    sz--;
    printf("sz is %d\n", sz);
    char * shuffled = new char[sz];
    return shuffled;
}

我在上述示例中的一个问题也是,为什么我必须将大小减 1 才能找到数组中元素的真实数量? 所以如果代码看起来像这样:

char * shuffleStrings(char * theStrings[])
{
    //how can I find the size??
    //I tried this and got a weird continuous block of printing
    int i = 0;
    while(!theStrings)
    {
      theStrings++;
      i++;
    }
    printf("sz is %d\n", i);
    char * shuffled = new char[i];
    return shuffled;
}

【问题讨论】:

  • 第二个问题你想达到什么目的?
  • 不知道你在问什么,但你的函数参数是指针,所以没有办法知道它们可能指向的数组的长度。您需要 a 单独传递一个长度,或者使用一个哨兵值,这就是第一个示例似乎正在做的事情。
  • 我已经回答了你的问题。但是,我不确定您使用 shuffle 指针尝试什么:它将是表中每个字符串一个字符,并且没有空终止符的位置。你不希望总大小在其中洗牌吗?或者你想在其中存储洗牌字符串的索引?在最后一种情况下,你应该考虑sizet_t* 而不是char*(或者更好的vector<size_t>shuffled(i))。

标签: c++ arrays string char size


【解决方案1】:

您不应该在第一个 sn-p 中递减计数器以获得实际大小。如果您有两个元素和一个空元素,则循环将以 value 结束,这是正确的。

在第二个 sn-p 中,您处理指向指针的指针。所以while-condition应该是*theStrings(假设一个NULL指针是你表末尾的标记。

请注意,在这两种情况下,如果表格不包含表格结束标记,您就有可能超出范围。为什么不使用 vector<string> ?然后你可以在没有任何循环的情况下获得大小,并且不会冒险超出范围

【讨论】:

    【解决方案2】:

    您在这里看到的是字符串中的“终止”字符或'\0'

    当您使用 char* 数组而不是字符串时,您可以更好地看到这一点。

    这是我制作的尺寸计算器示例。

    int getSize(const char* s)
    {
      unsigned int i = 0;
      char x = ' ';
      while ((x = s[i++]) != '\0');
      return i - 1;
    }
    

    如您所见,char*'\0' 字符结尾,表示字符串的结尾。这就是您在算法中计算的字符,这就是您获得额外字符的原因。

    关于您的第二个问题,似乎想创建一个具有所有字符串大小的新数组。

    为此,您可以计算每个字符串的长度,然后将它们加在一起以创建一个新数组。

    【讨论】:

    • 我怀疑 OP 会查找字符串数组的大小,而不是单个字符串。因此,他使用char** 并查找表结束标记(第一个 sn-p 中的空字符串,第二个 sn-p 中的 nullptr)。
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    相关资源
    最近更新 更多