当数组值为零而非空时,c循环停止

时间:2016-07-09 19:37:30

标签: c arrays while-loop int max

int findMax(int*sums){
  int t = 0;
  int max = sums[0];
  while (sums[t] != '\0'){
    printf("current max: %d %d\n", max, sums[t]);
    if (sums[t] > max ){
      max = sums[t];
    }
    t ++;
  }
  return max;
}

输出:

current max: 7 7
current max: 7 4
current max: 7 2

它忽略了列表的其余部分,sums。我认为这是因为sums中的下一个元素是0。但我无法理解为什么会将0视为'\0'(null)。

6 个答案:

答案 0 :(得分:3)

sums是一个整数数组(技术上是指向整数的指针)。 '\0'(空字节)和0是相同的值,因此当遇到0时,你的循环将停止。就整数而言,没有空值这样的东西。术语“null”用于表示值NULL,它是一个通常值为0的指针(即指向不指向任何内容的指针),以及null(0)字节,例如出现在以null结尾的字符串末尾的那个。

答案 1 :(得分:2)

  • 我记得我第一次遇到同样问题的时间(当我尝试使用int数组构建big number library时),最后我与其他答案所说的一样,技术 '\0' 0 具有相同的价值。

  • 现在这里有2种用来克服这个问题的方法,这些方法仅适用于某些条件

  • 案例1:
  

条件:当所有输入元素正面

  • 现在,由于所有输入元素都是正面,您可以通过插入否定

    来标记数组的结尾
  • 通常情况下,我会这样使用-1

    int a[] = {1, 2, 3, 4, -1}
    
    for(int index = 0; a[index] != -1; index++) 
    {
        //use the array element a[index] for desired purpose!
    }
    
  • 相反,您可以输入任何否定号码并按此方式执行

    for(int index = 0; a[index] >= 0; index++) 
    {
        //use the array element a[index] for desired purpose!
    }
    
  • 案例2:
  

条件:当所有元素都绑定在某个范围内

  • 你可能现在已经有了这个想法:),让我们说你的所有元素属于范围 [-100,100]

  • 您可以在范围的边界上方或下方插入任何数字以标记结尾...因此在上述情况下,我可以通过输入数字< -100和{{1}来标记结尾}。

  • 你可以这样迭代循环:

    >100
  

对两种情况进行推广,只需在数组末尾放置一个值,您确定该值不等于数组元素

for(int index = 0; (a[index] > -100) && (a[index] < 100); index++) 
{
    //use the array element a[index] for desired purpose!
}

所以,现在在案例1 下,你的while循环条件可以是以下任何一种:

    for(int index = 0; a[index] != value_not_in_array; index++) 
    {
        //use the array element a[index] for desired purpose!
    }

案例2

while(sums[t] != -1) //typically ended with `-1`
//(or)
while (sums[t] >= 0) //ended with any negative number

或更一般地说:

while ((sums[t] >min_range) && (sums[t] < max_range)) // when elements are bound within a range
  

两个案例的根本事实是我发现了一个   可以替代终止 while( sums[t] != value_not_in_array ) 字符。

希望这有帮助,快乐编码;)

答案 2 :(得分:1)

&#39; \ 0&#39;是不可打印的ASCII字符的表示。具体来说,它是字符0(如,零字符,而不是字符&#39; 0&#39;,其中48。在ASCII表上查找)。

&#39; \ 0&#39;与0相同的方式&#39; A&#39;是== 65.就编译器而言,没有区别。 &#39; \ 0&#39; == 0将始终评估为真。

请注意,与其他所有数组不同,只有字符串以&#39; \ 0&#39;终止。

答案 3 :(得分:0)

在C中,字符文字'\0'的值为(int)0,这就是转义序列转换为的内容。

#include <stdio.h>
int main() {
    int i = 0;
    char c = '\0';

    printf("%s\n", (i == c) ? "same" : "different");
}

http://ideone.com/sYRbYZ

答案 4 :(得分:0)

我认为您将NULL的指针检查与零值检查相混淆。

以下是两个略有不同的函数变体来说明这一点:

#include <stdio.h>

int
findPtr(int **sums)
{
    int t = 0;
    int max = *sums[0];
    int val;

    while (sums[t] != NULL) {
        val = *sums[t];
        printf("current max: %d %d\n", max, val);
        if (val > max) {
            max = val;
        }
        t++;
    }

    return max;
}

int
findArr(int *sums,int count)
{
    int t = 0;
    int max = sums[0];

    while (t < count) {
        printf("current max: %d %d\n", max, sums[t]);
        if (sums[t] > max) {
            max = sums[t];
        }
        t++;
    }

    return max;
}

由于零(0\0 - 相等)是总和中的有效值,因此无法用作 sentinel 为数组的结尾。您需要传递数组计数,如后一示例所示。

答案 5 :(得分:-1)

在你的代码中,你将一个指向整数数组的指针作为findMax函数的输入。 &#39; \ 0&#39;是一个角色。您正在将整数与字符进行比较,从而导致编译器转换字符&#39; \ 0&#39;并使用其整数等效的NULL(或简单地为0)。因此,程序在数组中的0时停止。 您可能想尝试:

int findMax(int*sums,int arraysize)
{
int t=0;
int max = sums[t];

while(t<arraysize)
{
    printf("current max: %d %d\n", max, sums[t]);
    if (sums[t] > max )
    {max = sums[t];}
 t++;
}
return max;
}