我的教授指定了一个项目,我们需要在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.有谁知道为什么会这样,并修复此方法? 感谢
答案 0 :(得分:1)
"长度"的概念在C语言(和一般的低级编程)中是一种棘手的问题。如果你有一个数组,那么C编译器知道它有多大,并为程序员提供一个接口来获取该字节值:sizeof
。问题是,数组是通过C中的指针传递的,如果没有某些元信息,通过指针确定大小是不可能的。确定数组长度的常用方法是
将结束标记附加到数组。确定长度只是迭代的问题,直到找到结束标记并返回迭代次数。请注意,这会使结束标记的值无法用作数组中的值。
只是传递数组的大小。以write
系统调用为例。除了文件句柄,它还需要一个指向数据及其长度的指针。为什么它的长度以及?因为指针不包含有关长度的信息。因此,要么使用像空字节这样的终结符,要么明确地传递长度。之前的想法可以放弃,因为write
系统调用应该是通用的;为了产生通用性,必须预期空字节是数组中的可能值,因此我不能将其用作终结符,原因如上所述。
您实际上最终使用哪一个完全取决于具体的用例。
显然你决定使用终结者变体。 \0
是空字节,是一个代码值为0x0
的ASCII字符。它通常用于终止C字符串。例如,strlen
使用它来确定C字符串的长度。
对于int
数组,没有这样的预定义终结符,所以你需要自己想出来一。如果您决定使用\0
,那么就这样吧,但我会使用文字0x0
代替,因为严格来说,\0
是字符字面意思而那只是不适合int
s。
要实际实现此功能,您需要将终止值附加到每个int
数组,您希望以这种方式确定其大小。然后编写函数以获得这样的int
数组的长度,即通过迭代直到找到终结符。