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;
}
相关推荐
喵叔哟8 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk14 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME14 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
Zfox_14 分钟前
【Linux】进程信号全攻略(二)
linux·运维·c语言·c++
起名字真南32 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去33 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
tyler_download44 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~44 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#1 小时前
go mod 依赖管理
开发语言·后端·golang
小春学渗透1 小时前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc