我有一个循环,必须从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)
我得到一个无限循环.如果我删除零的相等性,则输出不带第一个字母的字符串的反向.那么这里的问题是什么?
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)
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()输入读数是否成功的返回值.你可以改变j从size_t到long这确保所有的数据仍然适用,你可以达到-1的值.
另一种选择是使用以下语句结束for循环:
for (j = i - 1;;--j)
{
// code
if (j == 0) break;
}
Run Code Online (Sandbox Code Playgroud)
作为旁注:你的第一个while循环与strlen()in 相同string.h.
向下计数循环往往会变得有点晦涩难懂。考虑使用此替代方法:
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)