C变量递减错误

C变量递减错误,c,for-loop,C,For Loop,所以我现在非常困惑。在下面的代码中,我初始化for循环并尝试减小size\u t变量。但是,在执行此操作时,另一个size_t变量似乎开始减小 代码如下: /** * sanitize_octet - Sanitizes a given octet for ipv4 calculation * requirements. * * @octet - Octet to be sanitized. * * returns: * NULL pointer - failure * Poin

所以我现在非常困惑。在下面的代码中,我初始化for循环并尝试减小size\u t变量。但是,在执行此操作时,另一个size_t变量似乎开始减小

代码如下:

/**
 * sanitize_octet - Sanitizes a given octet for ipv4 calculation
 * requirements.
 *
 * @octet - Octet to be sanitized.
 *
 * returns:
 * NULL pointer - failure
 * Pointer to ret - success
 */
const char *sanitize_octet(const void *octet)
{
        char ret[4];
        size_t i = strlen(octet), j = i;

        if(i > 3) {
                printf("error: '%s' is not a valid octet.", (char *) octet);
                return NULL;
        }
        strcpy(ret, (char *) octet);
        while(i--) {
                if(!isdigit(ret[i])) {
                        printf("error: '%s' is not a valid octet.", ret);
                        return NULL;
                }
                if((int) ret[i] > 255) {
                        printf("error: '%s' is not a valid octet.", ret);
                        return NULL;
                }
        }
        if(j != 3) {
                i = 3 - j;
                for(j = 2; j > 1; j--) {
                        printf("j: %d, i: %d\n", j, i);
                        system("pause");
                }
        }
        puts(ret);
}
该功能仍在进行中。真正让我困惑的是底部的
for循环
。当初始化为
for(j=2;j>1;j--
时,它实际上会递减
i
而不是
j
,并将一直执行到崩溃。但是如果我用
j
具有不同值(例如3)的循环初始化,它会按预期执行。我以前从未见过类似的情况,并且非常困惑

下面是一个控制台输出示例,其中
j
初始化为
2

j: 2, i: 2
Press any key to continue . . .
1




j: 2, i: 1
Press any key to continue . . .
19
您可以清楚地看到,
i
正在递减,而不是
j

这可能是什么原因造成的

更新:以下是导致无限循环的代码:

const char *sanitize_octet(const void *octet)
{
        char ret[4];
        size_t i = strlen(octet), j = i;

        if(i > 3) {
                printf("error: '%s' is not a valid octet.", (char *) octet);
                return NULL;
        }
        strcpy(ret, (char *) octet);
        while(i--) {
                if(!isdigit(ret[i])) {
                        printf("error: '%s' is not a valid octet.", ret);
                        return NULL;
                }
                if((int) ret[i] > 255) {
                        printf("error: '%s' is not a valid octet.", ret);
                        return NULL;
                }
        }
        if(j != 3) {
                i = 3 - j;
                for(j = 2; j >= 0; j--) {
                        if(i) {
                                i--;
                        }
                        printf("j: %d, i: %d\n", j, i);
                        system("pause");
                }
        }
        puts(ret);
}
下面是该代码的控制台输出:

j: 2, i: 1
Press any key to continue . . .
j: 1, i: 0
Press any key to continue . . .
j: 0, i: 0
Press any key to continue . . .
j: -1, i: 0
Press any key to continue . . .
j: -2, i: 0
Press any key to continue . . .
j: -3, i: 0
Press any key to continue . . .
j: -4, i: 0
Press any key to continue . . .
j: -5, i: 0
Press any key to continue . . .
j: -6, i: 0
Press any key to continue . . .
j: -7, i: 0
Press any key to continue . . .
j: -8, i: 0
Press any key to continue . . .
j: -9, i: 0
Press any key to continue . . .

回答问题的第一个版本:

您的输出清楚地表明您调用了sanitize_octet一次,就得到了输出

j:2,i:2
按任意键继续…
一,

然后使用不同的参数再次调用sanitize_octet,然后获取输出

j:2,i:1
按任意键继续…
十九,

在两次对_octet进行清理的调用中,循环体只执行一次,因此j和i都不会递减

回答问题的第二个版本:

j
是一个
size\u t
,它是一个无符号值。因此
j>=0
始终为真。

您的
printf
只是混淆,因为它将大小t视为一个有符号的int,并将其打印为
j
,其中声明为
int

@user3121023的注释是正确的

让我们将代码简化为:

int j;
for (j = 2; j > 1; j--) {
    printf("j = %d\n", j);
}
您将看到类似的结果…一行
j=2

现在,让我们分解代码以删除
for
循环,并将其替换为
goto
(出于说明性原因)。这是相同的净结果:

    j = 2;
loop:
    printf("j = %d\n", j);
    j--;
    if (j > 1) goto loop;

这个分解很明显地说明了为什么您只能得到一行输出,因为循环终止时将
j
递减为1,如果
if
条件失败。

size\u t
是无符号的。因此,尽管
printf
用符号打印,但j始终>=0。您必须更改类型。

我不想这样做o说你没有执行正确的程序。在最后一个for循环中插入另一个测试输出,编译并再次运行。是的,这就是我现在想要用于测试目的的条件…Peter,你是说我有可能继续运行一个旧程序而不重新编译这个程序吗?我要重新启动我的计算机,看看这是否有帮助注:“1”和“19”并不是来自循环内部。看起来,你的输出来自于在回答问题后两次调用sanitize_octet来投票改变问题。大脑放屁哦。星期五在办公室?:)然而,我确实认为在某个时候,同一个代码发生了一些非常奇怪的事情(贴在abouve上)将执行并导致无限循环。我更新了我的帖子,现在又回到了我更新的原始问题。