2013-07-05 159 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 { 

     } 
}