2013-10-07 3 views
1

Функции nl_langinfo(INT_CURR_SYMBOL) возвращает указатель на строку, которая является константой формата:nl_langinfo() - слишком много информации

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

так в моей местности (en_GB.UTF-8), это было бы "GBP -£". Мне нужны только первые три буквы, так есть ли другой способ сделать это, кроме назначения нулевого символа третьему элементу или использования 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() и поле int_curr_symbolstruct lconv. Это из спецификации POSIX для поля:

Международный символ валюты, применимый к текущему языку. Первые три символа содержат буквенный символ международной валюты в соответствии с символами, указанными в стандарте ISO 4217: 1995. Четвертый символ (непосредственно предшествующий нулевому байту) - это символ, используемый для отделения символа международной валюты от денежного количества.

Как вы можете видеть, оно должно содержать то, что вы получаете.

О вашем втором подходе:

Кроме того, nl_langinfo (CRNCYSTR), также возвращает знак и символ, а только символ в необходимости. «- £» -> «£»

Это потому, что знак определяет символ, должен ли быть помещен перед значением (+), после того, как значения (-), или если он должен заменить радиус-символ (.). Это из POSIX спецификации langinfo.h:

символа местной валюты предшествует «-», если символ должен появиться перед значением, «+», если символ должен появиться после того, как значения, или «» если символ должен заменить символ radix. Если символом локальной валюты является пустая строка, реализации могут возвращать пустую строку ("").

Что касается метода получения части строки, я бы предложил скопировать соответствующую часть из возвращаемых значений в собственный буфер сразу после вызова. Вы должны это сделать, потому что структура и различные указатели, возвращаемые любой из функций, выделяются и поддерживаются библиотекой 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

Спасибо, я знаю о значении знака, но в то время меня не интересовал заказ. Как лучший (и единственный) ответ, вы получаете принятый ответ :) –

Смежные вопросы