C - while和for循环的奇怪行为

时间:2014-03-02 15:40:52

标签: c for-loop while-loop

我正在尝试编写一些简单的代码来验证数组中每个数字的位数,但是我遇到了一些奇怪的行为。

数组中的前3个数字在while循环中被评估为false,这意味着(120/1)%10等于0,这不应该是真或其他错误。

你有什么想法吗?该算法在数组中的第3个数字之后按预期工作。

提前感谢您的建议。

int main(){

    int nums[SIZE] = {120,210,3,4375,54443};
    int i;

    for (i = 0; i < SIZE; ++i){

        printf("Var i inside FOR: \t%d\n", i);
        printf("Var nums i inside FOR: \t%d\n", nums[i]);
        int wtest = 1;
        printf("Var wtest inside FOR: \t\t%d\n\n", wtest);

        while (((nums[i] / wtest)%10) != 0){
              wtest = wtest * 10;
              printf("Var wtest iside while: \t\t\t%d\n\n", wtest);                  
        }
    }  

    getchar();            
    return 0;

}

输出:

Var i inside FOR:   0
Var nums i inside FOR:  120
Var wtest inside FOR:       1

Var i inside FOR:   1
Var nums i inside FOR:  210
Var wtest inside FOR:       1

Var i inside FOR:   2
Var nums i inside FOR:  3
Var wtest inside FOR:       1

Var wtest iside while:          10

Var i inside FOR:   3
Var nums i inside FOR:  4375
Var wtest inside FOR:       1

Var wtest iside while:          10

Var wtest iside while:          100

Var wtest iside while:          1000

Var wtest iside while:          10000

Var i inside FOR:   4
Var nums i inside FOR:  54443
Var wtest inside FOR:       1

Var wtest iside while:          10

Var wtest iside while:          100

Var wtest iside while:          1000

Var wtest iside while:          10000

Var wtest iside while:          100000

2 个答案:

答案 0 :(得分:1)

您的代码逻辑错误。通过测试除法的余数为10,你实际检查相应位置的数字是零是否为零 - 这是最后一位数字120和210的情况。最后一位是你先检查的数字。

你应该只检查除法的结果是否为零:

int wtest = 1;

while (nums[i] / wtest != 0) {
      wtest = wtest * 10;
}

如果nums[i]小于wtest,则除法产生零,因此您可以将其重写为:

int wtest = 1;

while (nums[i] > wtest) {
      wtest = wtest * 10;
}

这当然不会给你数字计数,但是10的最小功率大于你的数字。

答案 1 :(得分:0)

int main(){

int nums[SIZE] = {120,210,3,4375,54443};
int i;

for (i = 0; i < SIZE; ++i){

    printf("Var i inside FOR: \t%d\n", i);
    printf("Var nums i inside FOR: \t%d\n", nums[i]);
    int j = 0;
    int n = nums[i];
   do
      {
        n=n/10;
           j++;
      }while(n!=0);                
    }
}  

getchar();            
return 0;

}

这里do-while循环将计算数字中的位数,数字0将被计为1使用do而不是while的原因。希望这对你有所帮助。