2016-12-01 37 views
1

在這個程序中,有兩個for循環。在每個for循環中,條件部分是text[i][0]text[i][j]。我不明白這種有條件的部分。這是如何運行或它如何工作?這個條件部分是如何工作的?

#include<stdio.h> 

int main(void) 
{ 
    char text[][80] = { 

    "When","in","the", 
    "course","of","human", 
    "events","" 
    }; 

    int i,j; 

    for(i=0; text[i][0]; i++){ 
     for(j=0; text[i][j]; j++) 
      printf("%c", text[i][j]); 
     printf(" "); 
    } 

    printf("\n%c", text[0][0]); 

    return 0; 
} 
+0

提示:長度爲零的C字符串的零插槽中有什麼? – WhozCraig

+0

第一個循環遍歷每個單詞。第二個循環遍歷每個字母。當第二個循環完成時,會添加一個空格。 – MotKohn

+1

在循環中使用帶有'「%c」'的printf()'來打印出字符串的每個字符......不是很明智。它應該是'printf(「%s」,test [i]);'而不是一個循環。然而,循環具有教學目的,因此它可以在作業中生存 - 但不要編寫這樣的代碼。 –

回答

0

在所有循環中,測試是否條件評估爲true;循環繼續,除非條件評估爲假或零。

在第一循環中,條件是等效於:

test[i][0] != 0 

其也可寫爲:

test[i] != '\0' 

因爲test[i]char *test[i][0]是字符串中的第一個字符與數據初始化爲空字符串""作爲數組中的最後一個條目,因此該字符串中唯一的字符是'\0'

在第二循環中,條件檢查是否:

test[i][j]` != 0; // Or '\0' 

達到字符串的末尾時,此評估爲假。整個內循環將被更好的替換爲一個簡單的:

printf("%s ", test[i]); 

它可能會更好,省略尾隨空白;有很多方法可以做到這一點,但都涉及測試或分配。

0

它將循環,直到它找到字符數組'\0'的結束text[i][0]text[i][j]
'\0'在for循環中表現爲false

0

for(i=0; text[i][0]; i++)在這個循環中,它用英語說,一直保持循環,直到字符串的第一個元素以NULL結尾,其中'\0'→十六進制0x00。由於它是零,它完成了循環。所以,在你的情況下,字符串應該是""

for(j=0; text[i][j]; j++)在這個循環中,它用英文表示保持循環,直到字符串的最後一個元素爲null-teminated。

整體而言,整個循環表示逐個遍歷所有字符串,直到看到""

0

Short Answer:這是一個處理嵌套循環的簡單概念。

說明:

char text[][80] = { 

    "When","in","the", 
    "course","of","human", 
    "events","" 
    }; 

它是具有80個字符MAX炭化長度2-d陣列的聲明。

 0 1 2 3 4 5 6 7 8 ..........79 
    W h e n 
    i n 
    t h e 
    c o u r s e 
    o f 
    h u m a n 
    e v e n t s 
    " " 

正如我們知道,在一個2-d陣列,它不是強制性的規定的行數,但是列數。這只不過是最後一個參數(即本例中爲80)。

for(i=0; text[i][0]; i++) 
    { 
     for(j=0; text[i][j]; j++) 
     { 
     printf("%c", text[i][j]); 
     printf(" "); 
     } 
    } 

外循環用於迭代行數,而內循環用於迭代列數。

因此,通過觀察每次迭代和上表,可以輕鬆理解文本[i] [j]的值。

我會建議通過嵌套循環的概念,以避免將來這些類型的混淆。