2017-08-29 93 views
-4

獲取奇怪的問題,嘗試從C++中的文本文件中讀取字符。當它找到一個撇號(十六進制92)時,它將其讀取爲多個字符。對於字符串「這是」我得到這個:C++:讀取字符不正確

i - 69 
t - 74 
’ - ffffff92 
s - 73 
it’s 

下面的代碼:

{ 
    FILE* fp = fopen("word.txt", "rb"); 
    char buf[111]; 

    fscanf(fp, "%s", buf); 

    for (int i = 0; i < strlen(buf); ++i) 
     printf("%c - %x\n", buf[i], buf[i]); 

    printf(buf); 
} 

開幕爲「R」給出了相同的結果。我怎樣才能讀撇號作爲它的單個字符?謝謝!

+1

這看起來更像是C.這是C 2 – Ron

+0

這是C++,但它也會在C中編譯。我使用流獲得相同的結果。 – UserX

+3

如果'char'被簽名(可能),它將在可變參數函數中被提升爲'int'時得到符號擴展。將簽名值打印爲無符號可能會導致意外輸出。 –

回答

1

將buf [i]轉換爲無符號字符 - 字符被正確讀取 - 但是當打印時 - 因爲它是負的 - 它被擴展爲int,然後加載到unsigned int,以便看到ffffff92 - 將轉換爲無符號值應顯示值正確

#include<cstdio> 

int main() { 

    char ch = static_cast<char>(0x92); 
    printf("%c - %x/%x\n", ch,ch,static_cast<unsigned char>(ch)); 

    return 0; 
} 

輸出

$ ./test 
� - ffffff92/92 
+0

謝謝,但我已經嘗試過,結果相同。 – UserX

+0

@UserX你的編譯器是什麼 - 因爲我用gcc 5.4得到了預測的輸出 –