这个小小的计划有什么问题?

时间:2013-07-05 11:53:10

标签: c while-loop

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++;
    }    
}

5 个答案:

答案 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 {

        }
}