2012-01-26 44 views
0

我有點新的語言(C),但我所試圖做的是非常簡單的海事組織。我敢肯定,我只是忽略了某些東西或者遇到了一些邏輯錯誤。大寫字母數,小寫字母數,空計數,並下到上轉換 - ç

正如標題所暗示的,所有我希望我的節目做的是計算的小寫字母,大寫字母和空格的#。作爲附加功能,它還將輸入的小寫字母轉換爲大寫。

#include <stdio.h> 

int main(void){ 

    int iochar, numdigits=0, numlower=0, numupper=0, numwhites=0; 

    printf("Please enter a phrase:\n\n"); 

    while((iochar=getchar())!=EOF) { 
     if ((iochar=' ')||(iochar='\t')||(iochar='\n')){ 
      numwhites++; 
      putchar(iochar); 
     } 
     else if((iochar>='0')&&(iochar<='9')) { 
     numdigits++; 
     putchar(iochar); 
     } 
     else if(('a'<=iochar)&&(iochar<='z')) { 
      numlower++; 
      putchar(iochar-32); 
     } 
     else if(('A'<=iochar)&&(iochar<='Z')) { 
      numupper++; 
      putchar(iochar); 
     } 
     else 
      putchar(iochar); 
    } 

    printf("%d white characters, %d digits, ",numwhites,numdigits); 
    printf("%d lowercase have been converted to ",numlower); 
    printf("uppercase and %d uppercase.\n",numupper); 

    printf("\n\n"); 

    return 0; 
} 
+0

好。問題是什麼? – ouah

+0

如果在編碼時錯過區分=和==,則在比較時保持左側不變。例如如果(''== iochar)。你可以避免這樣做。 – yadab

+0

@ yadab:當比較的兩邊都是左值時,你如何避免錯誤? –

回答

3
if ((iochar=' ')||(iochar='\t')||(iochar='\n')) 
在這個分配給iochar而且將永遠是真實的

。這應該是一個比較:

if ((iochar==' ')||(iochar=='\t')||(iochar=='\n')) 
0

請看isupper(int c)islower(int c),並在ctype.h定義isspace(int c)。您也可以從同一個文件中定義的toupper(int c)tolower(int c)中受益。

還要注意撒尼的回答,在C比較==,而分配是=。此外,可能內if報表,這使得可能的,甚至常見的錯誤,如你的分配。在我看來,一個好的習慣是這樣寫的比較:

if ('\n' == iochar) 

這樣一來,如果我做一個錯字,而是寫:

if ('\n' = iochar) 

我會期間出現語法錯誤編譯並且在運行時不奇怪的行爲。

+0

另一種方法是使用一個編譯器來警告'if(iochar ='\ n')',然後用你找到的更清晰的方式寫出來。風險是虛假的警告,尤其是在您沒有編寫並且不想修改以禁止警告的代碼中。 –

+0

@Steve:在這種情況下,'gcc'的作用是要求你將這個任務包裝在parens中來壓制警告。所以你寫'if((iochar ='\ n'))'如果你真的想要分配。一個常見的習慣用法是在'if's中爲'malloc(2)'賦值這種賦值風格:if(!(p = malloc(sizeof(* p)))){...}'。 – cha0site

+0

的確如此,這就是爲什麼如果有人寫了'if(c = * str ++)',你可能不想將它們的代碼改爲'if((c = * str ++))'來抑制警告。但在新代碼中,它一切正常。 –

0

我覺得撒尼Huttenen已經解決你的問題非常好。我還建議你致電

putchar(iochar) 

只有一次在你的bucle結束......它會更清晰。

相關問題