2014-02-07 122 views
0

我正在計算空格前一個單詞的字母數。例如。 「你好!」是我的輸入字符串,我正在計算第一個單詞中的字母數。這裏的while循環有什麼問題? C基礎知識

#include<stdio.h> 
#include<string.h> 

int main() 
{ 
    char a[30]; 
    int count = 0; 
    printf("Enter the string.\n"); // Enter hello how as string here. 
    gets(a); 
    for (i = 0; a[i] != '\0'; i++) 
     { 
     while(a[i+1] != ' ') 
     count++; 
     }       
    printf("%d\n",count); 
} 

這是一個更大的代碼的一小部分,我其實期待計數的值是5,但是它進入某種無限循環對此我無法弄清楚的。如果我使用而不是while,我會得到預期的答案。我知道獲取不是很可靠,一旦我在編程中變得更好,我就不會使用它,所以你會發布關於循環而不是獲取的答案。謝謝。

+1

您的計數變量是有點意義的,因爲你可以使用一個以上的條件你的測試表達式,然後用'i'作爲打印結果。 'for(i = 0; a [i] &&(a [i]!=''); ++ i);'。並且不要使用'gets()'。它的邪惡。改用'fgets()'。 – WhozCraig

+0

感謝您在代碼中指出有關空字符的錯誤,但這只是我在此處輸入的錯誤。 @WhozCraig:關於循環是的,多數民衆贊成我的意思是當我說它是一個更大的程序的一部分,我希望這是我的外部循環,然後我可以把更多的發言。 –

+0

啊,如果是這種情況,你仍然可以使用單個for-statement來對當前字進行字符計數。之後會做些什麼更棘手的事情。但高興這是有道理的。 – WhozCraig

回答

4

NUL字符寫有反斜槓(\),而不是正斜槓(/)。

for (i = 0; a[i] != '\0'; i++) 

此外,內循環將不終止,因爲你不增加i

while (a[i] != ' ') { 
    i++; 
    count++; 
} 

其實,你不應該有兩個循環。一個循環就是你需要的。

for (i = 0; a[i] != '\0' && a[i] != ' '; i++) { 
    count++; 
}  
+0

或者簡單地說'for(i = 0; a [i] && a [i]!=''; i ++);'我會在第一個單詞中的字母數量。 – Jordonias

4

語句中的表達不依賴於count。因此,在的每次迭代中,循環中的count會遞增,但這對沒有影響,而有條件,因此它將無限循環或永不循環,具體取決於a[i+1]處的字符。

除此之外,對於循環的條件語句也沒有被正確寫入。 NUL字符的字符串轉義是\0(反斜槓)。或者你可以比較一下0這個文字,它有完全相同的結果(雖然說到C的微妙之處並不意味着正好是一樣的,但這是分裂的頭髮)。

+0

這是對這個問題的正確答案,儘管關於NUL的觀察也是正確的。 (你也可以直接寫數值0,這是NUL的ASCII/Unicode值;這會更加C-idiomatic。) – keshlam

+0

@keshlam:我在編寫評論時將它寫入Edit中:) – datenwolf

1

使用'\0'而不是'/0'在for循環的條件,也是while循環的條件永遠不會是假的,因爲保持不變