2013-10-07 41 views
1

nl_langinfo(INT_CURR_SYMBOL)返回一個指向字符串常量,它是格式的功能:了nl_langinfo() - 太多的信息

$(THREE-LETTER-PSEUDOACRONYM) $(SIGN)$(SYMBOL) 

所以在我的區域(en_GB.UTF-8),這將是"GBP -£"。我只想要前三個字母,除了將第三個元素分配爲nul字符還是使用strncpy()之外,還有另外一種方法可以做到這一點嗎?

strcpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL)); // "GBP -£" 
int_curr_symbol[3] = '\0'; 

// or 

strncpy(int_curr_symbol, nl_langinfo(INT_CURR_SYMBOL), 3)); // "GBP" 

此外,nl_langinfo(CRNCYSTR),也返回符號和符號,而在僅需要符號。 "-£" - >"£"

回答

1

INT_CURR_SYMBOL似乎是一個GNU擴展。相反,我建議localeconv()struct lconvint_curr_symbol字段。這是POSIX規範適用的字段:

適用於當前語言環境的國際貨幣符號。前三個字符包含符合ISO 4217:1995標準中規定的字母國際貨幣符號。第四個字符(緊接在空字節之前)是用於將國際貨幣符號與貨幣數量分開的字符。

正如你所看到的,它應該包含你所得到的。

關於你的第二個方法:

此外,了nl_langinfo(CRNCYSTR相應的),也返回的符號和象徵,而只是象徵需要。 「 - £」 - >「£」

這是因爲符號定義符號是否將被放置的值(+)之前,該值後( - ),或者如果它應更換基數字符(。)。這從langinfo.h POSIX規格:

本地貨幣符號,前面加「 - 」如果符號應的值之前出現,「+」如果符號應該出現的值之後,或「」如果符號應該替換基數字符。如果本地貨幣符號是空字符串,則實現可能會返回空字符串(「」)。

至於獲取字符串部分的方法,我建議在調用之後將相關部分從返回值中複製到您自己的緩衝區中。您必須這樣做,因爲由C庫分配和維護由任一函數返回的結構和各種指針。

通過POSIX爲nl_langinfo()返回的值給出的理由是:

應用程序不得修改返回的字符串。由nl_langinfo()返回的指針可能會失效,或者隨後通過隨後在任何線程中調用nl_langinfo()或在同一線程或初始線程中調用nl_langinfo_l()來覆蓋字符串內容,方法是隨後調用setlocale()對應於項目類別(請參閱)或類別LC_ALL的類別,或通過隨後調用uselocale()更改與項目類別對應的類別。由nl_langinfo_l()返回的指針可能會失效,或者字符串內容可能被隨後在同一線程中對nl_langinfo_l()的調用或任何線程中的nl_langinfo()或隨後對freelocale()或newlocale()它釋放或修改傳遞給nl_langinfo_l()的語言環境對象。

,這裏是類似原因localeconv()給出:

的localeconv()函數將返回一個指向已填寫的對象。應用程序不應修改返回值指向的結構,也不應修改結構內指針所指向的任何存儲區域。返回的指針和結構中的指針可能會失效,或者隨後調用localeconv()可能會覆蓋結構或存儲區域。另外,返回的指針和結構中的指針可能會失效,或者結構或存儲區域可能會被後續對setlocale()調用LC_ALL,LC_MONETARY或LC_NUMERIC類別或調用uselocale()所覆蓋。其中改變類別LC_MONETARY或LC_NUMERIC。

+0

謝謝,我意識到標誌的重要性,但當時我對訂單不感興趣。作爲最好的(也是唯一的)答案,您將獲得接受的答案:) –