2013-07-20 44 views
1

我有以下代碼來計算輸入字符串中每個字母的出現次數。 while循環正確執行。現在我有arr[]包含'a的數量在arr[0]','b的在arr[1]等等。打印輸入流中每個字母的出現

但是,以下printf不顯示arr的完整內容。 (下面給出樣本o/p)。

如果我完全評論while循環,printf打印所有26 arr[]值罰款! 在這個簡單的程序中我可能會錯過什麼?

如果它的任何幫助,我使用VS 2008

int arr[26]={'\0'}; 
int i = 0, c = 0, idx = 0, count = 0; 
while((c = getchar()) != EOF) { 
    if('a' <= c && 'z' >= c) { 
    idx = c - 'a'; 
    arr[idx] = arr[idx]+1; 
    } 
} 
for(count = 0; count < 26; count++) { 
    printf("arr[%d] = %d\n", count, arr[count]); 
} 

,我得到的輸出(保持不同的不同的輸入):

abcxyz 
arr[0] = 1 
arr[1] = 1 
^CPress any key to continue . . . 

abcabc 
arr[0] = 2 
arr[1] 
^CPress any key to continue . . . 

@Nobilis:更新代碼佔大寫字母,也使打印更有意義:)

int main() 
{ 
    int arr[26]={'\0'}; 
    int i = 0, c = 0, idx = 0, count = 0; 
    while((c = getchar()) != EOF) 
    { 
     if('a' <= c && 'z' >= c) 
     { 
      idx = c - 'a'; 
      arr[idx] = arr[idx]+1; 
     } 
     if('A' <= c && 'Z' >= c) 
     { 
      idx = c - 'A'; 
      arr[idx] = arr[idx]+1; 
     } 
    } 
    for(count = 0; count < 26; count++) 
    { 

     printf("%c or %c = %d\n", ('A'+count), ('a'+count), arr[count]); 
    } 
} 
+0

你的問題是不是所有的輸入字符都被計算在內?我剛剛用輸入'abcabc'運行你的代碼,我正確地計數了:'arr [0] = 2 arr [1] = 2 arr [2] = 2'。你有沒有得到任何警告(除了未使用的'我')? – Nobilis

+1

旁邊: int arr [26] = {'\ 0'}; 你的代碼是完全正確的。你應該在另一個地方尋找問題。 對於你的數組初始化,你正在用char初始化int。這是完全合法的C,並且工作正常,但不是你應該習慣的。 – Geod24

+0

輸入字符計數正常。如果我輸入爲'abcxyz',我看到(使用VS調試器)arr [0],arr [1],arr [2]和arr [23],arr [24],arr [25]包含1。所有其他arr值爲0.但是,當我嘗試打印出來時,我得到以下不完整的輸出:'abcxzy arr [0] = 1 arr [1] = 1^C按任意鍵繼續。 。 「。 – VivereJay

回答

2

你不及格EOF正確,在Windows上是按Ctrl +ž。另外,請記住,您的算法不會考慮大寫字母。

+1

添加考慮大寫字母的代碼,只是因爲它使這個完整,並可能幫助某人! – VivereJay

6

按當你想結束輸入字符時,你可以在windows上使用3210而不需要在CTRL-C上使用CTRL-Z

CTRL-C終止程序,因此沒有更多的處理將發生,你將看不到輸出。

+0

Rohan我使用'CTR + C'作爲密鑰 –

+1

@Nobilis,謝謝更新了答案。 – Rohan

+0

Unix上的CTRL-D在Windows上不能像CTRL-Z一樣工作。 CTRL-D的作用是隻在輸入流的開頭或連續兩次使用輸入流時結束。 http://stackoverflow.com/a/1516177/139746 –

相關問題