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)。
答案 0 :(得分:3)
sums
是一个整数数组(技术上是指向整数的指针)。 '\0'
(空字节)和0是相同的值,因此当遇到0时,你的循环将停止。就整数而言,没有空值这样的东西。术语“null”用于表示值NULL
,它是一个通常值为0的指针(即指向不指向任何内容的指针),以及null(0)字节,例如出现在以null结尾的字符串末尾的那个。
答案 1 :(得分:2)
我记得我第一次遇到同样问题的时间(当我尝试使用int
数组构建big number library时),最后我与其他答案所说的一样,技术 '\0'
和 0
具有相同的价值。
现在这里有2
种用来克服这个问题的方法,这些方法仅适用于某些条件
条件:当所有输入元素正面
现在,由于所有输入元素都是正面,您可以通过插入否定号
来标记数组的结尾通常情况下,我会这样使用-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!
}
条件:当所有元素都绑定在某个范围内
你可能现在已经有了这个想法:),让我们说你的所有元素属于范围 [-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");
}
答案 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;
}