如何在函数内找到(* char)数组的大小?

时间:2016-03-21 20:13:52

标签: c++ arrays string char size

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

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;
}

2 个答案:

答案 0 :(得分:0)

你不应该减少计数器以获得真正的大小,在第一个片段中。如果你有两个元素和一个空元素,循环将以值结束,这是正确的。

在第二个片段中,您处理指向指针的指针。所以while条件应该是*theStrings(假设NULL指针是表格末尾的标记。

请注意,在这两种情况下,如果表格不能保存表格末尾的标记,则可能会超出范围。为什么不使用 vector<string> ?然后你可以在没有任何循环的情况下获得大小,并且不会有超出界限的风险

答案 1 :(得分:0)

你在这里看到的是&#34;终止&#34;字符串中的字符或'\0'

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

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

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

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

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

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