2013-07-05 120 views
1
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

'而(STR [1] = '%'!)'将跳过'\ 0'。 –

+2

你为什么期望内循环停止在'\ 0'处? –

+0

哦,别忘了'void main()'不好。使用'int main()'或'int main(int argc,char * argv [])''。 – tangrs

回答

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) 
0

,虽然将跳过 '\ 0',因为它不是一个 '%'

0

@BryanOlivier是正确的,所以

while ((str[i] != '%')&&(str[i] != '\0')){ 
     printf("%c", str[i++]); 
    } 

,而不是

while (str[i] != '%'){ 
     printf("%c", str[i++]); 
    } 

试这个。

1

的问题是,一旦你到这里:

Oct: %o Dec: %d Roman: %r 
         ^

内while循环只会永远保持纺纱(你可以验证通过删除r,它会停止,因为它应该)。

要解决此问题,您可以用if (str[i] != '%')替换while (str[i] != '%'),而不必触摸原始字符串。

一些更多的评论:

变化从voidint返回类型的main。而刚刚的main结束括号前添加return 0;。这是一个典型的C约定,它向操作系统指示运行是否成功(0表示正常,非零意味着有问题)。

如果您编译代码,你应该已经得到了它警告警告(不要让他们因为一些错误并不总是那么明显和警告通知做你为他们伟大的工作)。

随着我的GCC编译器我warning: return type of ‘main’ is not ‘int’ [-Wmain]。我与-Wall-Wextra标志运行它。

+1

有关警告的观点是很好的一点。我倾向于推荐使用'-Wall -Werror'运行'clang'或'gcc'。 – Will

+0

谢谢,会补充说回答:) – Nobilis

0

你应该这样做,而不是 - >

while (str[i] != '\0'){ 
     if(str[i++] != '%') { 
      printf("%c", str[i]) 
     } 
     else { 

     } 
}