C 标准库 - <limits.h>和<locale.h>详解

目录

简介

库宏

实例

简介

库宏

库函数

库结构

实例


<limits.h>

简介

C 标准库中的 <limits.h> 头文件提供了整数类型的范围和特性的相关信息,它定义了一些宏常量,用于表示各种整数类型的最大值和最小值。这个头文件还定义了一些整数类型的特性,如二进制位的数目和整数的取值范围。

库宏

下面的值是特定实现的,且是通过 #define 指令来定义的,这些值都不得低于下边所给出的值。

  1. CHAR_BIT:一个字节中的比特数,通常为 8。
  2. SCHAR_MIN:有符号字符型的最小值,通常为 -128。
  3. SCHAR_MAX:有符号字符型的最大值,通常为 127。
  4. UCHAR_MAX:无符号字符型的最大值,通常为 255。
  5. CHAR_MIN:char 类型的最小值(有符号或无符号),如果 char 表示负值,则它的值等于 SCHAR_MIN,否则等于 0。
  6. CHAR_MAX:char 类型的最大值(有符号或无符号),如果 char 表示负值,则它的值等于 SCHAR_MAX,否则等于 UCHAR_MAX。
  7. MB_LEN_MAX:多字节字符中的最大字节数,通常为 1。
  8. SHRT_MIN:短整型的最小值,通常为 -32768。
  9. SHRT_MAX:短整型的最大值,通常为 +32767。
  10. USHRT_MAX:无符号短整型的最大值,通常为 65535。
  11. INT_MIN:整型的最小值,通常为 -2147483648。
  12. INT_MAX:整型的最大值,通常为 2147483647。
  13. UINT_MAX:无符号整型的最大值,通常为 4294967295。
  14. LONG_MIN:长整型的最小值,通常为 -9223372036854775808。
  15. LONG_MAX:长整型的最大值,通常为 9223372036854775807。
  16. ULONG_MAX:无符号长整型的最大值,通常为 1.8446744e+19。

需要注意的是,这些宏常量的值都是给出了最小的限制,具体实现中可能会有更高的限制。

实例

cpp 复制代码
#include <stdio.h>
#include <limits.h>

int main() {
    printf("CHAR_BIT = %d\n", CHAR_BIT);
    printf("SCHAR_MIN = %d\n", SCHAR_MIN);
    printf("SCHAR_MAX = %d\n", SCHAR_MAX);
    printf("UCHAR_MAX = %u\n", UCHAR_MAX);
    printf("CHAR_MIN = %d\n", CHAR_MIN);
    printf("CHAR_MAX = %d\n", CHAR_MAX);
    printf("MB_LEN_MAX = %d\n", MB_LEN_MAX);
    printf("SHRT_MIN = %d\n", SHRT_MIN);
    printf("SHRT_MAX = %d\n", SHRT_MAX);
    printf("USHRT_MAX = %u\n", USHRT_MAX);
    printf("INT_MIN = %d\n", INT_MIN);
    printf("INT_MAX = %d\n", INT_MAX);
    printf("UINT_MAX = %u\n", UINT_MAX);
    printf("LONG_MIN = %ld\n", LONG_MIN);
    printf("LONG_MAX = %ld\n", LONG_MAX);
    printf("ULONG_MAX = %lu\n", ULONG_MAX);
    return 0;
}

让我们编译和运行上面的程序,这将产生下列结果:

cpp 复制代码
CHAR_BIT = 8
SCHAR_MIN = -128
SCHAR_MAX = 127
UCHAR_MAX = 255
CHAR_MIN = -128
CHAR_MAX = 127
MB_LEN_MAX = 5
SHRT_MIN = -32768
SHRT_MAX = 32767
USHRT_MAX = 65535
INT_MIN = -2147483648
INT_MAX = 2147483647
UINT_MAX = 4294967295
LONG_MIN = -2147483648
LONG_MAX = 2147483647
ULONG_MAX = 4294967295

<locale.h>

简介

<locale.h> 是 C 标准库中的一个头文件,提供了一些函数和宏来进行本地化(即国际化)处理。

本地化是指针对不同的语言、文化和地区,为程序提供相应的显示格式和文化习惯支持。在需要编写多语言、多地区的程序时,<locale.h> 可以帮助开发者进行本地化处理,使得程序可以在不同的语言和地区下正常工作。

库宏

下面列出了头文件 locale.h 中定义的宏,这些宏将在下列的两个函数中使用:

  • LC_ALL:设置所有本地化选项。
  • LC_COLLATE:影响字符串比较函数(如 strcoll() 和 strxfrm())。
  • LC_CTYPE:影响字符处理函数(如 isalpha() 和 toupper())。
  • LC_MONETARY:影响货币格式化函数(如 localeconv())。
  • LC_NUMERIC:影响数字格式化函数(如 printf() 和 scanf() 中的小数点格式)。
  • LC_TIME:影响时间和日期格式化函数(如 strftime())。

库函数

下面列出了头文件 locale.h 中定义的函数:

  • char *setlocale(int category, const char *locale):setlocale 函数用于设置或读取地域化信息。它允许程序在运行时动态地改变本地化环境。category 参数指定了需要设置或读取的地域化分类,可以是 LC_ALL、LC_COLLATE、LC_CTYPE、LC_MONETARY、LC_NUMERIC 或 LC_TIME 中的一个。locale 参数表示要设置的地域化名称,如果为 NULL 则表示仅查询当前地域化设置。该函数返回一个表示当前地域化环境的字符串指针。
  • struct lconv *localeconv(void):localeconv 函数用于获取地域化信息结构体指针,该结构体包含了与本地化相关的货币格式、小数点格式等信息。通过这个函数,程序可以获取当前地域化环境下的各种格式化信息,例如货币符号、小数点字符等。函数返回一个指向 struct lconv 结构体的指针,该结构体定义在 <locale.h> 头文件中。

这两个函数在进行国际化开发时非常有用,能够帮助程序根据不同的地域化环境提供相应的显示格式和文化习惯支持。

库结构

cpp 复制代码
typedef struct {
   char *decimal_point;
   char *thousands_sep;
   char *grouping;    
   char *int_curr_symbol;
   char *currency_symbol;
   char *mon_decimal_point;
   char *mon_thousands_sep;
   char *mon_grouping;
   char *positive_sign;
   char *negative_sign;
   char int_frac_digits;
   char frac_digits;
   char p_cs_precedes;
   char p_sep_by_space;
   char n_cs_precedes;
   char n_sep_by_space;
   char p_sign_posn;
   char n_sign_posn;
} lconv

以下是各字段的描述:

序号 字段 & 描述
1 decimal_point 用于非货币值的小数点字符。
2 thousands_sep 用于非货币值的千位分隔符。
3 grouping 一个表示非货币量中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 0 意味着前一个值将应用于剩余的分组。
4 int_curr_symbol 国际货币符号使用的字符串。前三个字符是由 ISO 4217:1987 指定的,第四个字符用于分隔货币符号和货币量。
5 currency_symbol 用于货币的本地符号。
6 mon_decimal_point 用于货币值的小数点字符。
7 mon_thousands_sep 用于货币值的千位分隔符。
8 mon_grouping 一个表示货币值中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 0 意味着前一个值将应用于剩余的分组。
9 positive_sign 用于正货币值的字符。
10 negative_sign 用于负货币值的字符。
11 int_frac_digits 国际货币值中小数点后要显示的位数。
12 frac_digits 货币值中小数点后要显示的位数。
13 p_cs_precedes 如果等于 1,则 currency_symbol 出现在正货币值之前。如果等于 0,则 currency_symbol 出现在正货币值之后。
14 p_sep_by_space 如果等于 1,则 currency_symbol 和正货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和正货币值之间不使用空格分隔。
15 n_cs_precedes 如果等于 1,则 currency_symbol 出现在负货币值之前。如果等于 0,则 currency_symbol 出现在负货币值之后。
16 n_sep_by_space 如果等于 1,则 currency_symbol 和负货币值之间使用空格分隔。如果等于 0,则 currency_symbol 和负货币值之间不使用空格分隔。
17 p_sign_posn 表示正货币值中正号的位置。
18 n_sign_posn 表示负货币值中负号的位置。

下面的值用于 p_sign_posnn_sign_posn:

描述
0 封装值和 currency_symbol 的括号。
1 放置在值和 currency_symbol 之前的符号。
2 放置在值和 currency_symbol 之后的符号。
3 紧挨着放置在值和 currency_symbol 之前的符号。
4 紧挨着放置在值和 currency_symbol 之后的符号。

实例

cpp 复制代码
#include <stdio.h>
#include <locale.h>
#include <time.h>

int main() {
    setlocale(LC_ALL, "zh_CN.UTF-8"); // 设置本地化环境为中文UTF-8编码

    // 获取当前本地化环境的时间格式信息
    struct tm *tm_now;
    time_t time_now = time(NULL);
    tm_now = localtime(&time_now);
    char time_str[128];
    strftime(time_str, sizeof(time_str), "%x %X", tm_now);
    printf("当前时间: %s\n", time_str); // 输出本地化时间信息

    // 获取当前本地化环境的货币格式信息
    struct lconv *lc = localeconv();
    printf("货币符号: %s\n", lc->currency_symbol); // 输出货币符号
    printf("千位分隔符: %s\n", lc->thousands_sep); // 输出千位分隔符

    // 格式化输出数字
    double number = 1234567.89;
    printf("格式化后的数字: %'.2f\n", number); // 使用千位分隔符和小数点进行格式化输出

    // 格式化输出货币值
    double price = 1234.56;
    printf("格式化后的货币值: %s%.2f\n", lc->currency_symbol, price); // 使用本地化货币符号和小数点格式进行格式化输出

    return 0;
}
相关推荐
lb36363636363 分钟前
分享一下arr的意义(c基础)(必看)(牢记)
c语言·知识点
Swift社区1 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht1 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht2 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20242 小时前
Swift 数组
开发语言
南东山人2 小时前
一文说清:C和C++混合编程
c语言·c++
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc3 小时前
《Python基础》之字符串格式化输出
开发语言·python
Red Red4 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全