C变量递减错误
所以我现在非常困惑。在下面的代码中,我初始化for循环并尝试减小size\u t变量。但是,在执行此操作时,另一个size_t变量似乎开始减小 代码如下: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
/**
* 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上)将执行并导致无限循环。我更新了我的帖子,现在又回到了我更新的原始问题。