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++;
}
}
答案 0 :(得分:5)
您正在尝试打印字符串中的所有字符,省略任何%
个字符。你不需要内循环,而内循环是造成你所有困境的原因。内部循环将超出字符串的末尾,因为它不会测试空终止字符。
简单的解决方案是用if
语句替换内部循环。我们的想法是遍历整个字符串,并打印任何不是%
的字符。
int i = 0;
while (str[i] != '\0')
{
if (str[i] != '%')
printf("%c", str[i]);
i++;
}
虽然我可能会使用指针来写这个:
const char *p = str;
while (*p)
{
if (*p != '%')
printf("%c", *p);
p++;
}
另外,您的main
函数具有非标准声明。对于不希望处理参数的C main
,您的主要应该是:
int main(void)
答案 1 :(得分:1)
问题是,一旦你到达这里:
Oct: %o Dec: %d Roman: %r
^
内部while循环将永远保持旋转(您可以通过删除r
来验证它是否会停止)。
要解决此问题,您可以将while (str[i] != '%')
替换为if (str[i] != '%')
,而不必触及原始字符串。
还有一些评论:
将main
的返回类型从void
更改为int
。并在return 0;
的右大括号之前添加main
。这是典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零表示存在问题)。
如果您使用警告编译代码,您应该收到警告(请启用它们,因为有些错误并不总是那么明显,并且警告会很好地通知您)。
使用我的GCC编译器,我获得了warning: return type of ‘main’ is not ‘int’ [-Wmain]
。我使用-Wall
和-Wextra
标志运行它。
答案 2 :(得分:0)
while会跳过'\ 0',因为它不是'%'
答案 3 :(得分:0)
@BryanOlivier是对的,所以
while ((str[i] != '%')&&(str[i] != '\0')){
printf("%c", str[i++]);
}
而不是
while (str[i] != '%'){
printf("%c", str[i++]);
}
试试这个。
答案 4 :(得分:0)
你应该这样做 - >
while (str[i] != '\0'){
if(str[i++] != '%') {
printf("%c", str[i])
}
else {
}
}