2011-05-28 92 views
2

我需要從輸入中讀取一些無符號字符(ASCII值> 127)。 所以我used-如何使用gets()讀取無符號字符數組?

unsigned char S[102]; 

,但是當我需要輸入像這個 -

gets(S); 

編譯器顯示錯誤:

error: invalid conversion from 'unsigned char*' to 'char*'

所以我的問題是如何通過閱讀獲取無符號字符數組( )或任何其他功能存在。

+4

做到這一點的最佳方法是在任何情況下都不會使用'gets'來做任何事情。如果有人拿着槍對着你的頭說道:「用'在你的代碼中獲取',你應該能夠接受你的命運,爲了人類的更大利益。 – 2011-05-28 07:36:40

回答

2

首先,你不應該使用gets。它不能在任何情況下安全使用。我的評論對於幽默效果可能有些誇張,但這一點仍然存在。

您應該使用的功能,而不是getsfgetsfgets需要一個FILE *指針(但你可能只是想通過stdin)和最大長度,所以它知道不會溢出你的緩衝區。與gets不同,fgets不能保證在整行中讀取 - 該行可能太大而無法保存緩衝區。但是,您可以輕鬆地從中恢復,並編寫代碼以各種方式正確處理輸入(而使用gets則只需希望緩衝區足夠長,如果不是,誰知道會發生什麼。)

我對你打算閱讀什麼樣的數據有點不清楚。如果是文字,fgets可能就是您要找的內容。它仍然需要char *,所以要完成這個工作,當你將它傳遞給該函數時,你需要將S轉換爲char *。一般來說,強制轉換是一件壞事,尤其是從已簽名到未簽名類型的強制轉換,但在這種情況下,可能會發生任何錯誤。

如果您實際上是將二進制數據讀入您的無符號數組中,那麼您應該查看fread。與fgets不同,它需要一個void *來適應您需要閱讀的任何類型的數據,因此不需要投射。請注意,fread讀取的是塊而不是行,因此如果您想要文本輸入,則應該查看其他地方 - 它不會嘗試讀取整行,也不會在看到行結束時停止讀入緩衝區。

+0

感謝您的回答。但是,fgets()可以將字符作爲ascii值大於127的輸入,這意味着我需要無符號字符,因爲fgets((char *,)(int),(FILE *)),在這裏我看到它帶有char *輸入,不(unsigned char *)? – russell 2011-05-28 08:01:49

+0

@russell - 如果它大於127,那麼'signed char *'(可能在您的平臺上是'char *')會將其解釋爲負數,但相同的二進制數據將寫入您的數組中,所以當您數組將它解釋爲'unsigned'數據,它們將會是大於127的數字。試試這個:'int main(void){unsigned short u = 65535,* up = u;/* signed */short * sp =(short *)up,s = * sp; printf(「Unsigned:%hu \ nSigned:%hi \ n」,u,s);返回0; }' – 2011-05-28 08:05:56

+0

所以,這意味着我不需要使用unsigned char S [102];使用char S [102]就足夠了?它可以處理仍然讀取,處理和寫入字符大於127? – russell 2011-05-28 08:18:33

1

而不是gets你可以使用:

  • fgets (s, MAX_BUFFER, stdin);
  • scanf ("%[^\n]%*c", s);

與值取ASCII字符時,雙方將合作大於127,如:.±┼┤.␤▒⎽␤ .␍≤┼⎽≤└ .␍≤┼⎽├⎼ .±┼┤.┴␊⎼⎽␋⎺┼ .±┼┤.┴␊⎼⎽␋

gets也將做這件事。你不需要將你的數組作爲unsigned char *

+0

謝謝。主要問題是gets()是否可以採用ASCII> 127的字符。現在我知道它可以。但是當我們使用strcmp()比較2個字符串(ASCII值 - > 0-255)時,它能夠正確地排序這2個字符串? – russell 2011-05-28 14:23:54

+0

您的'scanf'示例同樣不好,因爲它不執行邊界檢查。 'scanf'可以做邊界檢查,但爲了這個目的很難正確使用'scanf',很難從不好的情況中恢復,爲了這個目的堅持'fgets'要好得多。 – 2011-05-28 19:18:37

相關問題