C - 在整数数组中区分0和\ 0

时间:2010-11-30 21:43:20

标签: c arrays printing zero

  

可能重复:
  nul terminating a int array

我正在尝试打印出数组中的所有元素:

int numbers[100] = {10, 9, 0, 3, 4};
printArray(numbers); 

使用此功能:

void printArray(int array[]) {
    int i=0;
    while(array[i]!='\0') {
        printf("%d ", array[i]);
        i++;
    }
    printf("\n");
}

问题在于,当然C不会区分数组中的另一个零元素和数组的结尾,之后它全部为0(也标注为\ 0)。

我知道0和\ 0之间在语法上没有区别所以我正在寻找一种方法或 hack 来实现这一目标:

10 9 0 3 4

而不是

10 9

数组也可能如下所示:{0,0,0,0}因此输出仍然需要为0 0 0 0。

有什么想法吗?

3 个答案:

答案 0 :(得分:9)

不要使用也可能在数组中的值终止数组。

您需要找到 UNIQUE 终结符。

由于您没有在数组中指出任何负数,我建议您使用-1终止:

int numbers[100] = {10, 9, 0, 3, 4, -1};

如果不起作用,请考虑:INT_MAXINT_MIN

作为最后的手段,编写一个序列值保证不在您的数组中,例如:-1, -2, -3表示终止。

关于使用0\0终止,没有任何“特殊”。终止任何适合您案件的工作。


如果您的阵列确实可以按任意顺序保存所有值,则无法使用终止符,您将 来跟踪数组的长度。

从您的示例中,这看起来像:

int numbers[100] = {10, 9, 0, 3, 4};
int Count = 5;
int i;

for(i=0; i<Count; ++i)
{
    // do something with numbers[i]
}

答案 1 :(得分:0)

对于声明为

的数组
int numbers[100] = {10, 9, 0, 3, 4};

绝对没有办法区分初始化程序中的显式0和用于初始化数组尾部的隐式零。它们是相同的零。所以,你想要做的事情不能按字面意思完成。

您可以这样做的唯一方法是选择一些int值作为保留的专用终结符值,并始终明确地将其添加到数组的末尾。即如果您选择-42作为终结符值,则必须将其声明为

int numbers[100] = {10, 9, 0, 3, 4, -42};

并迭代到你的周期中的第一个-42

答案 2 :(得分:0)

实现这一目标的典型方法是:

  • 定义一个标记值(其他人建议)
  • 定义一个带有int(实际值)的结构和一个bool(表示它是否是哨兵)并创建一个数组而不是
  • 使用数组
  • 传递数组的长度
  • 定义一个包含数组和长度的结构,并将其传递给

请注意,第一项和第二项几乎相同。