C 什么';这个小程序怎么了?
while将跳过“\0”,因为它不是“%”,while将跳过“\0”,因为它不是“%”。@BryanOlivier是对的,所以C 什么';这个小程序怎么了?,c,while-loop,C,While Loop,while将跳过“\0”,因为它不是“%”,while将跳过“\0”,因为它不是“%”。@BryanOlivier是对的,所以 void main(){ /* This string needs to be printed without the '%' and in segments. */ char str[] = "Oct: %o Dec: %d Roman: %r"; int i = 0; while (str[i] != '\0'){ /* When I
void main(){
/* This string needs to be printed without the '%' and in segments. */
char str[] = "Oct: %o Dec: %d Roman: %r";
int i = 0;
while (str[i] != '\0'){
/* When I run this nested loops, for some reason they don't stop at '\0'. */
while (str[i] != '%'){
printf("%c", str[i++]);
}
if (str[i] == '%')
i++;
}
}
而不是
while ((str[i] != '%')&&(str[i] != '\0')){
printf("%c", str[i++]);
}
试试这个。@BryanOlivier是对的,所以
void main(){
/* This string needs to be printed without the '%' and in segments. */
char str[] = "Oct: %o Dec: %d Roman: %r";
int i = 0;
while (str[i] != '\0'){
/* When I run this nested loops, for some reason they don't stop at '\0'. */
while (str[i] != '%'){
printf("%c", str[i++]);
}
if (str[i] == '%')
i++;
}
}
而不是
while ((str[i] != '%')&&(str[i] != '\0')){
printf("%c", str[i++]);
}
尝试此操作。您正在尝试打印字符串中的所有字符,忽略任何
%
字符。你不需要一个内环,内环是你所有痛苦的原因。内部循环将超出字符串的结尾,因为它不测试空终止字符
简单的解决方案是用if
语句替换内部循环。其思想是遍历整个字符串,并打印任何不是%
的字符
while (str[i] != '%'){
printf("%c", str[i++]);
}
虽然我可能会用指针来写:
int i = 0;
while (str[i] != '\0')
{
if (str[i] != '%')
printf("%c", str[i]);
i++;
}
另外,您的
main
函数有一个非标准声明。对于不希望处理参数的Cmain
,您的main应该是:
const char *p = str;
while (*p)
{
if (*p != '%')
printf("%c", *p);
p++;
}
您正试图打印字符串中的所有字符,但忽略了所有
%
字符。你不需要一个内环,内环是你所有痛苦的原因。内部循环将超出字符串的结尾,因为它不测试空终止字符
简单的解决方案是用if
语句替换内部循环。其思想是遍历整个字符串,并打印任何不是%
的字符
while (str[i] != '%'){
printf("%c", str[i++]);
}
虽然我可能会用指针来写:
int i = 0;
while (str[i] != '\0')
{
if (str[i] != '%')
printf("%c", str[i]);
i++;
}
另外,您的
main
函数有一个非标准声明。对于不希望处理参数的Cmain
,您的main应该是:
const char *p = str;
while (*p)
{
if (*p != '%')
printf("%c", *p);
p++;
}
问题是一旦你到了这里:
int main(void)
内部while循环将永远保持旋转(您可以通过移除r
,验证它是否会停止)
要解决此问题,您可以将while(str[i]!='%')
替换为if(str[i]!='%')
,而不必触摸原始字符串
还有几点意见:
将main
的返回类型从void
更改为int
。添加返回0
就在main
的右括号之前。这是一个典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零表示有问题)
如果您在编译代码时带有警告,那么您应该会得到警告(一定要启用它们,因为有些bug并不总是那么明显,警告可以很好地通知您)
使用GCC编译器,我得到了警告:“main”的返回类型不是“int”[-Wmain]。我使用
-Wall
和-Wextra
标志运行它。问题是,一旦您到达这里:
int main(void)
内部while循环将永远保持旋转(您可以通过移除r
,验证它是否会停止)
要解决此问题,您可以将while(str[i]!='%')
替换为if(str[i]!='%')
,而不必触摸原始字符串
还有几点意见:
将main
的返回类型从void
更改为int
。添加返回0
就在main
的右括号之前。这是一个典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零表示有问题)
如果您在编译代码时带有警告,那么您应该会得到警告(一定要启用它们,因为有些bug并不总是那么明显,警告可以很好地通知您)
使用GCC编译器,我得到了警告:“main”的返回类型不是“int”[-Wmain]。我使用
-Wall
和-Wextra
标志运行它。您应该改为-->
您应该这样做-->
while(str[i]!='%')
将跳过\0
。为什么您希望内部循环停止在\0
?哦,别忘了void main()
是坏的。使用int-main()
或int-main(int-argc,char*argv[])
@tangrs因为这是C,所以它应该是int-main(void)
两者都可以工作,但是int-main(void)
更好,并且可以避免在迂腐的编译器上出现一些警告。while(str[i]!='%”
将跳过\0
。为什么希望内部循环在\0
处停止?哦,别忘了void main()
是坏的。使用int-main()
或int-main(int-argc,char*argv[])
@tangrs因为这是C,所以应该是int-main(void)
两者都可以工作,但是int-main(void)
更好,可以避免在迂腐的编译器上出现一些警告。你关于警告的观点很好。我倾向于推荐使用-Wall-Werror
运行clang
或gcc
。谢谢,我会补充这一点来回答:)你关于警告的观点很好。我倾向于建议使用-Wall-Werror
运行clang
或gcc
。谢谢,我会在回答时添加这一点:)