如何查找C数组的长度

时间:2016-11-22 20:57:08

标签: c arrays

我的教授指定了一个项目,我们需要在C中制作反向抛光计算器(在postscript语法中输入)。我正在研究一种方法来查找我扫描的值数组的长度(通过.txt文件)。我目前的方法是

int length(int list[]) {
    int c = 0;
    while(0 == 0) {
        if(list[c] != '\0') {c++;}
        else {break;}
    } 
    return c;
}

并且对它的要求是

int sizeA = length(list);
printf("\n%d\n", sizeA);

目前只输出长度为0.有谁知道为什么会这样,并修复此方法? 感谢

1 个答案:

答案 0 :(得分:1)

"长度"的概念在C语言(和一般的低级编程)中是一种棘手的问题。如果你有一个数组,那么C编译器知道它有多大,并为程序员提供一个接口来获取该字节值:sizeof。问题是,数组是通过C中的指针传递的,如果没有某些元信息,通过指针确定大小是不可能的。确定数组长度的常用方法是

  • 将结束标记附加到数组。确定长度只是迭代的问题,直到找到结束标记并返回迭代次数。请注意,这会使结束标记的值无法用作数组中的值。

  • 只是传递数组的大小。以write系统调用为例。除了文件句柄,它还需要一个指向数据及其长度的指针。为什么它的长度以及?因为指针不包含有关长度的信息。因此,要么使用像空字节这样的终结符,要么明确地传递长度。之前的想法可以放弃,因为write系统调用应该是通用的;为了产生通用性,必须预期空字节是数组中的可能值,因此我不能将其用作终结符,原因如上所述。

您实际上最终使用哪一个完全取决于具体的用例。

显然你决定使用终结者变体。 \0是空字节,是一个代码值为0x0的ASCII字符。它通常用于终止C字符串。例如,strlen使用它来确定C字符串的长度。
对于int数组,没有这样的预定义终结符,所以你需要自己想出来一。如果您决定使用\0,那么就这样吧,但我会使用文字0x0代替,因为严格来说,\0字符字面意思而那只是不适合int s。

要实际实现此功能,您需要将终止值附加到每个int数组,您希望以这种方式确定其大小。然后编写函数以获得这样的int数组的长度,即通过迭代直到找到终结符。