C中的奇怪行为

时间:2015-10-22 21:58:12

标签: c

所以,我将这两种算法放在一起:

int digitCount(int num){
    int count;
    while (num) {
        num /= 10;
        count++;
    }
    return count;
}

int digitSplit(int num, int digit) {
    int i, base = 1, count = digitCount(num);
    for(i = 1; i <= count + 1 - digit; i++)
        base *= 10;
    return num % base / (base / 10);
}

虽然我知道它们可能不是最佳的,但是digitSplit给了我一些非常奇怪的行为:

for (i = 1; i < 4; i++)
    printf("%d", digitSplit(432, i));

无论设置如何,这个都会崩溃。

printf("%d, %d, %d", digitSplit(432, 1), digitSplit(432, 2), digitSplit(432, 3));

这个推出0,0,2。

printf("%d", digitSplit(432, 1));
printf("%d", digitSplit(432, 2));
printf("%d", digitSplit(432, 3));

这些分别推出了4 3 2,否则会导致程序崩溃=&gt; for - 环

不知道为什么会发生这种情况,我的digitSplit是原因,但0,0,2是怎么来的?

1 个答案:

答案 0 :(得分:1)

C中可能出现的一些问题: 如果不初始化变量,则它具有最后一次更改内存位的值。使用值初始化变量总是很好的形式,但在C中它是非常重要的:

int digitCount(int num){
    int count = 0;
    while (num) {
        num /= 10;
        count++;
    }
    return count;
}

您在digitSplit()中返回的内容不正确。你想要移动一个特定的数字,使它在一个位置,然后用数字10隔离数字。首先,我们必须将我们想要的数字移到一个地方,将数字除以10 ^(计数位) ,而不是10 ^(计数+ 1位数)。设10 ^(count-digit)= base,所以我们有 (NUM /碱)。现在我们只需要得到一个人的位置。我们用mod:

做到这一点
int digitSplit(int num, int digit) {
    int i, base = 1, count = digitCount(num);
    for(i = 1; i <= count - digit; i++)
        base *= 10;
    return (num/base)%10;
}