我正在C程序中读取3个整数,并将它们存储在int *[]
中。然而,在阅读第三个int
时,我想将其与前一个2进行比较,如果它大于这两个值,则程序结束,如果不是,则程序将继续读取第三个。输入,直到其满足CCD_ 3循环中的条件为止。
我的问题是,尽管bool表达式看起来是合乎逻辑的(至少对我来说(,并且我输入的值成功地存储在数组中,但为什么它总是跳过while
循环?
#include <stdio.h>
int main(void) { // Stelios Papamichail 4020
int *sides[3];
int i;
for(i=0; i < 3; i++) {
if(i == 2) {// third side
scanf(" %d",&sides[i]);
while((sides[i] < sides[i-1]) && (sides[i] < sides[i-2])) {
scanf(" %d",&sides[i]);
}
} else {
scanf(" %d",&sides[i]);
}
}
return 0;
}
代码中的主要问题是,它调用了未定义的行为。
在你的代码中,通过说来详细说明
int *sides[3];
您正在定义一个由3个int *
s组成的数组(由3个指向整数的指针组成的数组(,而您需要的是一个由三个int
s组成的数组。将其更改为
int sides[3];
也就是说,根据您的要求,如果您想检查第三个输入是否最小,那么while
条件中的&&
应该是||
。
你说:
我正在C程序中读取3个整数,并将它们存储在int*[]中。然而,在读取第三个int时,我想将其与前面的2进行比较,如果它大于两者,程序将结束,如果不是,程序将继续读取第三。输入,直到它满足while循环中的条件。
嗯,int
与指针不同。int
允许您进行整数运算,而int *
允许您进行指针运算。(指针存储int
变量的内存地址,因此,当您递增它时,它会将其值移动到下一个地址,这与添加一个不同——因为int
需要一个以上的字节才能放入内存(您可以在程序中使用int *
(正如您在评论中所说,您的老师已经指出了这一点(,但这就像做煎蛋饼,但使用苹果而不是鸡蛋(好吧,它们都是圆的,但结果不一样(。我猜不出你的老师要求你使用int *
的原因,但这给了我编译器的警告,告诉我这样做的风险(编译器是CLANG,在FreeBSD上(
我的问题是,尽管bool表达式看起来合乎逻辑(至少对我来说(,并且我输入的值成功地存储在数组中,但为什么它总是跳过while循环?
好吧,这取决于你试图检查的内容。这方面的第一件事是,你在代码中说将最后一个输入数字与之前的数字进行比较,如果它大于或等于其中任何一个,则再次输入第三个数字。如果这是你想要的,那是正确的,但我也猜不出做这样一个测试的目的是什么,所以我唯一能得出的结论是这个测试写得不好(主要是因为我接下来要说什么(。
关于你的程序的第三条评论是:
如果您需要将最后一个值与之前的值进行比较,为什么不在循环之外进行检查呢。这样做不仅使您的代码看起来更简单,而且还消除了if (i == 2)
测试的需要(您根本不需要在代码中使用i
,只需编写:
for(i=0; i < 3; i++) {
scanf("%d",&sides[i]); /* you don't need the space before %d */
}
while((sides[2] < sides[1]) && (sides[2] < sides[0])) {
scanf("%d",&sides[2]);
}
最后,您在评论中说,将int *sides[3]
更改为仅int sides[3]
会导致编译失败。我已经尝试过了,仅仅是消除了*
,就消除了我从代码编译中得到的三个警告。无法猜测为什么你说它不使用该消除进行编译。
注释
您的代码似乎试图检查三角形的三条边是否允许您构建一条。如果这是真的,正确的测试是让第三个三角形大于前几条边的差,小于前几条的和,而这不是你上面写的。有效的测试应该是:
#define ABS(expr) ((expr) < 0 ? -(expr) : (expr))
while (sides[2] >= sides[1] + sides[0] || sides[2] <= ABS(sides[1] - sides[0])) {
scanf("%d", &sides[2]);
}
给定大小的数组声明为:
int sides[3];
而未知大小的数组(基本上是指针(声明为:
int* sides;//you should use malloc to allocate the array memory at run time.
使用
int*sides[3];
您正在声明一个指针数组。
您的最终代码应该看起来像:
#include <stdio.h>
int main(void) { // Stelios Papamichail 4020
int sides[3];
int i;
for(i=0; i < 3; i++) {
if(i == 2) {// third side
printf("%d %d %dn", sides[i], sides[i-1], sides[i-2]);
scanf(" %d",&sides[i]);
while((sides[i] < sides[i-1]) && (sides[i] < sides[i-2])) {
printf("%d %d %dn", sides[i-2], sides[i-1], sides[i]);
scanf(" %d",&sides[i]);
}
} else {
printf("%d %d %dn", sides[i-2], sides[i-1], sides[i]);
scanf(" %d",&sides[i]);
}
}
return 0;
}
我添加了一些指纹来了解发生了什么。