【问题标题】:C - differentiate between 0 and \0 in integer array [duplicate]C - 区分整数数组中的 0 和 \0 [重复]
【发布时间】:2010-11-30 21:43:20
【问题描述】:

可能重复:
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。

有什么想法吗?

【问题讨论】:

  • 感谢我看到它并投票决定关闭它,我对此有点小窍门。
  • 一般情况下,在字符上下文中使用'\0'来引用空值,在整数上下文中使用0。编译器对它们的处理方式几乎相同,但对于阅读您的代码的程序员来说具有不同的含义。看到将int i'\0' 进行比较的代码会在我的脑海中触发警告。分配*str = 0 而不是*str = '\0' 也是如此。

标签: c arrays printing zero


【解决方案1】:

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

您需要找到一个 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]
}

【讨论】:

  • 我认为INT_MININT_MAX 是您所追求的宏名称。
  • 数组也可以包含负数。
  • 然后考虑我建议的其他主题。数组是否会包含 INT_MAX(可能是 2,147,483,647)或 INT_MIN(–2,147,483,648)?这个数据代表什么,有没有最后才能找到的值?
【解决方案2】:

实现这一点的典型方法是:

  • 定义一个哨兵值(其他人建议)
  • 用一个 int(实际值)和一个 bool(指示它是否是哨兵)定义一个结构,然后将它们组成一个数组
  • 用数组传递数组的长度
  • 定义一个包含数组和长度的结构体,然后传递它

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

【讨论】:

    【解决方案3】:

    对于声明为的数组

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

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

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

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

    并迭代到循环中的第一个 -42

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多