2014-01-27 68 views
-1

我目前正在處理一項任務,其中有一部分遇到了問題。我需要能夠從終端識別5種不同的貨幣符號($,£,¥,€,$)並將其打印回來。這是我分配完成這部分的功能。 教授告訴我們每個人都使用UTF-8編碼組合來識別單個符號。該函數試圖做的所有事情是看下一個字符是否是其中一個符號,如果是,則打印該特定符號。如果它不識別任何4種「外國」貨幣,它將默認該符號爲$,即使它是一個數字或不同的符號。謝謝您的幫助!在c中標識並打印出貨幣符號

determcur() 
{ 
    char c = getchar(); 
    if(c == 0xC2) 
    { 
      c = getchar(); 
      if(c == 0xA3) 
      { 
        printf("%c%c", 0xC2, 0xA3); 
      } 
      if(c == 0xA5) 
      { 
        printf("%c%c", 0xC2, 0xA5); 
      } 
    } 
    if(c == 0xE2) 
    { 
      c = getchar(); 
      if(c == 0x82) 
      { 
        c = getchar(); 
        if(c == 0xAC) 
        { 
          printf("%c%c%c", 0xE2, 0x82, 0xAC); 
        } 
        if(c == 0xB9) 
        { 
          printf("%c%c%c", 0xE2, 0x82, 0xB9); 
        } 
      } 
    } 
    else printf("%c", 0x24); 
} 
+0

你能解釋一下您有什麼麻煩? – IllusiveBrian

+0

這是一個問答網站。如果你不問問題,你將不會得到答案。 –

+0

對不起,我第一次使用這個網站,問題是它不能識別輸入時的符號,而是總是返回$。 – user3238882

回答

2

對於很多C編譯器,char是一個帶符號的8位整數。

有符號的8位整數只能從-128持有值127。他們不能持有價值0x80的一樣,0xE2等

對於像if(c == 0xAC)編譯器知道在c值可以不會高於127,因此知道條件必須是錯誤的。出於這個原因,編譯器可以優化您的代碼(通過消除所有由於「必須是假」條件而無法達到的代碼),直至getchar();printf("%c", 0x24);

要修復此使用uint8_t而不是char。如果您找不到uint8_t(例如,您使用古老的C語言),請使用unsigned char

但是..

這有可能是輸入實際上是從一個文件或東西來,而不是從鍵盤來的。爲此,您應該正確處理EOFEOF將不適合(有符號或無符號)char,也不適合uint8_t。這意味着您應該將getchar()返回的值存儲在int中,然後將其與EOF進行比較,然後將其轉換爲unsigned charuint8_t,並使用類型轉換將其與0xAC進行比較。

基本上,它變得有點像這樣:

int c; 

    c = getch(); 
    if(c == EOF) exit(0); 
    if((uint8_t)c == 0xC2) { 
     ... 
    } 
+0

幫助過這麼多!非常感謝你一步一步解釋所有事情,並給出解決問題的不同選擇。 – user3238882