在For循环条件中向后迭代数组,当使用无符号整数导致无限循环时停止在0

moj*_*awi 10 c size-t

我有一个循环,必须从j到0(包括).我的j变量的类型size_t通常是无符号的.

我的代码:

#include<stdio.h>
#include<conio.h>

#define SIZE 100

int main(){
    char str[SIZE];
    size_t i=0;
    size_t j;
    puts("Enter any string");
    scanf("%s",str);
    while(str[i]!='\0'){
        i++;
    }


    for(j=i-1;j>=0;j--){

        printf("%c",str[j]);
    }


    getch();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个无限循环.如果我删除零的相等性,则输出不带第一个字母的字符串的反向.那么这里的问题是什么?

Fli*_*ikk 9

for(j=i; j>0; j--) {
    printf("%c", str[j-1]);
}
Run Code Online (Sandbox Code Playgroud)

将是另一种选择.
对于初学者来说可能更容易理解.
但其他答案会更好.

编辑:我会说最好的将是for(j=i; j-- > 0;)l3x.
在检查它是否大于0之后递减j.

使用do {} while()循环也可以.

j = i;
do {
   j--;
   printf("%c", str[j]);
} while (j > 0);
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像是一个带有奇怪格式的丑陋代码的纯粹示例。 (2认同)

P.P*_*.P. 6

size_t是一个无符号整数,它永远不会小于0.所以for循环中的条件总是如此:

for(j=i;j>=0;j--)
Run Code Online (Sandbox Code Playgroud)

您可以将条件修改为(有点丑陋):

for(j=i; j-- > 0;){
   ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,在您的情况下,您也打印\0空字节,这是一个不可打印的字符.(因为以j等于字符串长度的值开始).上述条件也照顾到了这一点.

也:

  • 你可以使用strlen()而不是自己循环.
  • 检查scanf()输入读数是否成功的返回值.


3li*_*t0r 6

你可以改变jsize_tlong这确保所有的数据仍然适用,你可以达到-1的值.

另一种选择是使用以下语句结束for循环:

for (j = i - 1;;--j)
{
    // code
    if (j == 0) break;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注:你的第一个while循环与strlen()in 相同string.h.


Lun*_*din 5

向下计数循环往往会变得有点晦涩难懂。考虑使用此替代方法:

const size_t max = i-1; // maximum value that j can have

for(j=0; j<=max; j++)
{
  ... str[max-j];
}
Run Code Online (Sandbox Code Playgroud)