在 C 的条件语句中使用数组元素时出错

Error when using array elements in conditional statements in C

我学习了 C 语言,但遇到了这种我无法解释的不一致之处。我到处搜索并查看了所有数据类型定义和关系语法,但这超出了我的范围。

在 C How to Program 一书中,有一个问题是制作一个二进制到十进制的转换器,其中输入必须是 5 位数字。我开发了以下代码来接收一个数字,并通过除法和取余运算将其拆分为单独的数字并将每个数字分配给数组中的一个元素。当我尝试通过检查每个数组元素以查看它是 1 还是 0 来验证输入的数字确实是二进制时,问题就出现了。

代码如下:

#include <stdio.h>

int power (int x, int y); //prototype

int main(void)
{
    int temp, bin[5], test;
    int n=4, num=0;
//get input
    printf("%s","Enter a 5-digit binary number: ");
    scanf("%d", &temp);

//initialize array
    while(n>=0){
        bin[n]=temp/power(10,n);
        temp %= power(10,n);
        n--;    }

//verify binary input
for (test=4; test>=0; test--){
    if ((bin[n]!=0)&&(bin[n]!=1)){
        printf("Error. Number entered is not binary.\n");
        return 0;   }

//convert to decimal 
    while(n<=4){
        num+=bin[n]*power(2,n);
        n++;    }

    printf("\n%s%d\n","The decimal equivalent of the number you entered is ",num);
    return 0;
}

//function definition
int power(int x, int y)
{
    int n, temp=x;
    if(y==0) return 1;
    for(n=1; n<y; n++){
        temp*=x;    }
    return temp;
}

有人可以向我解释为什么无论输入(无论是:00000 还是 12345),我总是收到错误消息?其他一切似乎工作正常。 感谢您的帮助。

更新:如果将if语句移到while循环之前。这应该仍然有效吗?

更新2:没关系,我发现了我的错误。鉴于 sps 和 Kunal Tyagi 提供的解决方案,将 if 语句移动到 while 重复之前确实有效。

之后

    while(n>=0){
    bin[n]=temp/power(10,n);
    temp %= power(10,n);
    n--;    }

n 设置为 -1 所以当你尝试转换为十进制时,语句 bin[n] 实际上是 bin[-1] 所以它 returns 你出错了。

这看起来像是作业,但您的问题在括号中。更具体地说,第 23 行。尽管有缩进,但该行不是逻辑 if 语句的一部分(因为这在 C 中无关紧要)。 无论如何,程序将在检查条件后于 test=4 退出。

解决方案:

if ((bin[test]!=0)&&(bin[test]!=1)) { // << this brace
        printf("Error, number entered was not binary.\n");
        return 0;   } }  //exit program // notice 2 braces here

一个问题是,在检查数字是否为二进制时,您 return 在错误的地方。你只需要 return if 这个数字不是二进制的。但是你 return 在 if 条件之外。所以你的程序 returns 不管输入是什么。

for (test=4; test>=0; test--){
    if ((bin[test]!=0)&&(bin[test]!=1))
        printf("Error, numbered entered was not binary.\n");
        // Issue here, you are returning outside if
        return 0; }  //exit program 

您可以将其更改为:

for (test=4; test>=0; test--){
    if ((bin[test]!=0)&&(bin[test]!=1)) {
         printf("Error, numbered entered was not binary.\n");
         // Return inside the if
         return 0; // exit program
    }                
} 

还有一个问题。在将数字转换为十进制之前,您需要设置 n = 0;

//convert to decimal
n = 0; /* need to set n to zero, because by now  
          n will be -1.
          And initially when n is -1, accessing 
          bin[-1] will result in undefined behavior
       */ 
while(n<=4){
    num+=bin[n]*power(2,n);
    n++;    }