如何返回给定的C中预定义字符串数组中字符串的计数?[副本]

z18hc3ub  于 2023-08-03  发布在  其他
关注(0)|答案(3)|浏览(80)

此问题在此处已有答案

Miscalculation of array size inside a function(3个答案)
21天前关闭

typedef char String[100];

int main
{ 
    String strArray[] = {"one", "two", "three"};
    int numStrings = countStrings(strArray);
    printf("count: %d\n", numStrings);
    return 0;
}

int countStrings(String strArray[]) // doesnt work
{
    int count = sizeof(strArray) / sizeof(strArray[0])
    return count;
}

字符串

deyfvvtc

deyfvvtc1#

这是因为当你将数组传递给countStrings时,它会衰减为char **,而char **并不包含它所指向的数组的长度信息。您需要将该信息传递给countStrings函数。
main中,strings仍然是一个数组,sizeof将执行您所期望的操作。

int main(void) {
    char *strings[] = {"one", "two", "three"};

    size_t num_strings = sizeof(strings) / sizeof(*strings);

    some_function(strings, num_strings);
}

字符串
简短回答:求数组的长度很容易。找到一个 * 指针 * 的“长度”是没有意义的,它是你的函数接收的。

r3i60tvu

r3i60tvu2#

当你把一个数组传递给一个函数时,它会衰减为指向它的第一个元素的指针。在C中,这样的指针并不“知道”它指向多少个元素。因此,您不能仅通过此指针来计算元素。
一个可能的解决方案是添加一个特殊的元素,它标记数组的结束。
在这种情况下,您可以使用空字符串。这可以是长度为0的String。它的第一个字符是字符串结束标记'\0'

int countStrings(String strArray[])
{
    for (int count = 0; strArray[count][0] != '\0'; count++) {
        /* nothing to do here */
    }
    return count;
}

字符串
请注意,这个解决方案访问内存越界(超出给定的数组),如果数组错过了数组结束标记!
随意使用任何其他字符串作为标记。
正如你可能注意到的,同样的原则也用在C字符串上。即使char数组(您的String)可以有容量,您也不能在其中存储实际长度。当你将一个String传递给一个函数时,该函数会接收到指向第一个char的衰减指针。字符串的结尾由特殊字符'\0'标记。
C标准库的所有字符串函数都需要这个特殊字符。
您将在main()的参数中找到该原则的另一种用法。标准第5.1.2.2.1章规定:
argv[argc]应为空指针。
所以你有两个选项来迭代所有的程序参数:
1.从0到argc - 1计数;
1.循环直到argv[argc] == null
在第J.5.1章“环境参数”中:
在托管环境中,main函数接收第三个参数char *envp[],该参数指向一个以null终止的char指针数组,每个指针指向一个字符串,该字符串提供有关程序执行环境的信息(5.1.2.2.1)。
因为没有给出envc(环境变量的计数),所以只能迭代直到找到null指针。
其他语言提供了其他解决方案。它们的数组更复杂,并且 * 可以 * 实际容纳元素的数量。

wnvonmuf

wnvonmuf3#

感谢所有的帮助!我可以使用这个功能。

int countStrings(String strArray[])
{
  int i = 0, count = 0;
  
  while (*strArray[i] != '\0')
  {
    count++;
    i++;
  }
  
  return count;
}

字符串

相关问题