C 标准库
# C 标准库 - 参考手册
C标准库是一组C内置函数、常量和头文件,比如<stdio.h>、<stdlib.h>、<math.h>等,标准库可以作为C程序员的参考手册。
# C 标准库 - <assert.h>
C标准库的assert.h头文件提供了一个名为assert的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。assert.h标准库主要用于在程序运行时进行断言,断言是一种用于测试假设的手段,通常用于调试阶段,以便在程序出现不符合预期的状态时立即发现问题。
<assert.h>提供的断言机制是C语言中一个有用的工具,帮助开发人员在早期发现和修复程序中的错误。已定义的宏assert指向另一个宏NDEBUG,宏NDEBUG不是<assert.h>的一部分。如果已在引用<assert.h>的源文件中定义NDEBUG为宏名称,则assert宏的定义如下:
assert(expression)
assert宏用于测试表达式expression是否为真,如果为假(即结果为0),assert会输出一条错误信息并终止程序的执行,错误信息会包括以下内容:
- 触发断言失败的表达式
- 源文件名
- 行号
在发布版本中,可以通过定义NDEBUG来禁用所有的assert断言,如:
#define NDEBUG
#include <assert.h>
2
一旦定义了NDEBUG,assert宏将被预处理为一个空语句,不会有任何运行时开销。
#include <stdio.h>
#include <assert.h>
void test_positive(int x)
{
assert(x > 0);
}
int main()
{
int a = 5;
int b = -3;
test_positive(a); // 这个断言通过
test_positive(b); // 这个断言失败,程序终止
printf("This line will not be executed if an assertion fails. \n");
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在上面的例子中,当调用test_positive(b)时,由于b是一个负数,断言x > 0失败,程序会输出类似的信息并终止:

断言的作用:
- 调试: 在开发阶段,通过断言可以快速发现程序中的逻辑错误或假设不成立的情况
- 文档: 断言可以作为文档的一部分,描述函数的前置条件和后置条件
- 防御性编程: 虽然不建议在生产代码中使用断言来进行参数的检查,但某些情况下,断言可以作为最后的防线
注意事项:
- 性能: 在性能敏感的代码中,断言可能会增加额外的开销,尤其是在大量调用的情况下,因此,发布版本中通常会禁用断言
- 错误处理: 断言不应该用于处理可以预期并且可以恢复的错误情况,断言更多地用于捕获程序员的错误
#define NDEBUG
#include <stdio.h>
#include <assert.h>
void test_positive(int x)
{
assert(x > 0);
}
int main()
{
int a = 5;
int b = -3;
test_positive(a); // 这个断言通过
test_positive(b); // 这个断言失败,程序终止
printf("This line will not be executed if an assertion fails. \n");
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
库宏:
| 函数 | 描述 |
|---|---|
void assert(int expression) | 这实际上是一个宏,不是一个函数,可用于在C程序中添加诊断 |
- 描述
C库宏void assert(int expression)允许诊断信息被写入到标准错误文件中,也即是,它可用于在C程序中添加诊断。assert()是标准库中的一个宏,定义在assert.h头文件中,用于在程序运行时检查某个表达式是否为真,如果该表达式为假,assert()宏会输出错误信息并终止程序的执行。
assert()对于调试和测试非常有用,它是一个强大的工具,帮助开发人员在程序运行时检查条件并在条件不满足时提供详细的错误信息。
- 声明
#include <assert.h>
assert(expression);
2
- 参数
expression--检查的一个条件表达式,可以是一个变量或任何C表达式,如果为TRUE,assert()不执行任何动作,如果为FALSE,则会在标准错误stderr上显示错误消息,并中止程序执行。
如果为假(0),会输出一条包含以下信息的错误消息:
- 触发断言的表达式的文本表示
- 源文件名
- 行号
- 函数名(如果可用)
然后程序调用abort()函数中止执行。
返回值: 这个宏不返回任何值
实例
#include <assert.h>
#include <stdio.h>
int main()
{
int a;
char str[50];
printf("请输入一个整数值: ");
scanf("%d", &a);
assert(a >= 10);
printf("输入的整数是: %d\n", a);
printf("请输入字符串: ");
scanf("%s", str);
assert(str != NULL);
printf("输入的字符串是: %s\n", str);
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- 禁用断言: 在发布版本中,可以通过禁用断言提高性能,定义
NDEBUG来实现:
#define NDEBUG
#include <assert.h>
2
一旦定义了NDEBUG,所有的assert()宏将被预处理为一个空语句,不会进行任何检查。
# C 标准库 - <ctype.h>
C标准库的ctype.h头文件提供了一些函数,可用于测试和转换字符,这些函数主要用于检查字符的类型(如字母、数字、空白字符等),以及进行字符大小写转换。<ctype.h>提供了一组方便的函数,用于处理字符的分类和转换操作,是C标准库中处理字符操作的重要工具。
#include <stdio.h>
#include <ctype.h>
int main()
{
char ch;
// 示例字符
char chars[] = "a1 B? \n";
// 检查每个字符的类型
for (int i = 0; chars[i] != '\0'; i++)
{
ch = chars[i];
printf("Character: '%c'\n", ch);
if (isalpha(ch))
{
printf(" - isalpha: Yes\n");
}
else
{
printf(" - isalpha: No\n");
}
if (isdigit(ch))
{
printf(" - isdigit: Yes\n");
}
else
{
printf(" - isdigit: No\n");
}
if (isspace(ch))
{
printf(" - isspace: Yes\n");
}
else
{
printf(" - isspace: No\n");
}
if (isprint(ch))
{
printf(" - isprint: Yes\n");
}
else
{
printf(" - isprint: No\n");
}
if (ispunct(ch))
{
printf(" - ispunct: Yes\n");
}
else
{
printf(" - ispunct: No\n");
}
}
// 字符大小写转换示例
char lower = 'a';
char upper = 'A';
printf("tolower('%c') = '%c'\n", upper, tolower(upper));
printf("toupper('%c') = '%c'\n", lower, toupper(lower));
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66

下面列出了头文件ctype.h中定义的函数,这些函数用于测试字符是否属于某种类型,这些函数接受int作为参数,它的值必须是EOF或表示为一个无符号字符。如果参数c满足描述的条件,则这些函数返回非零(true),如果参数不满足条件,则返回零。
# int isalnum(int c)
描述: 监测所传的字符是否是字母和数字
声明:
int isalnum(int c);参数:
c-- 要检查的字符返回值: 如果
c是一个数字或一个字母,则该函数返回非零值,否则返回0实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 'd';
int var2 = '2';
int var3 = '\t';
int var4 = ' ';
if (isalnum(var1))
{
printf("var1 = |%c| 是字母数字\n", var1);
}
else
{
printf("var1 = |%c| 不是字母数字\n", var1);
}
if (isalnum(var2))
{
printf("var2 = |%c| 是字母数字\n", var2);
}
else
{
printf("var2 = |%c| 不是字母数字\n", var2);
}
if (isalnum(var3))
{
printf("var3 = |%c| 是字母数字\n", var3);
}
else
{
printf("var3 = |%c| 不是字母数字\n", var3);
}
if (isalnum(var4))
{
printf("var4 = |%c| 是字母数字\n", var4);
}
else
{
printf("var4 = |%c| 不是字母数字\n", var4);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# int isalpha(int c)
- 描述: 检查所传字符是否是字母
- 声明:
int isalpha(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是字母,返回非零值,否则返回0 - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 'd';
int var2 = '2';
int var3 = '\t';
int var4 = ' ';
if (isalpha(var1))
{
printf("var1 = |%c| 是字母\n", var1);
}
else
{
printf("var1 = |%c| 不是字母\n", var1);
}
if (isalpha(var2))
{
printf("var2 = |%c| 是字母\n", var2);
}
else
{
printf("var2 = |%c| 不是字母\n", var2);
}
if (isalpha(var3))
{
printf("var3 = |%c| 是字母\n", var3);
}
else
{
printf("var3 = |%c| 不是字母\n", var3);
}
if (isalpha(var4))
{
printf("var4 = |%c| 是字母\n", var4);
}
else
{
printf("var4 = |%c| 不是字母\n", var4);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# int iscntrl(int c)
- 描述
C库函数int iscntrl(int c)检查所传的字符是否是控制字符,根据标准ASCII字符集,控制字符的ASCII编码介于0x00(NUL)和0x1f(US)之间,以及0x7f(DEL),某些平台的特定编译器实现还可以在扩展字符集0x7f以上中定义额外的控制字符。
- 声明:
int iscntrl(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是控制字符,则该函数返回非零值,否则返回0 - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int i = 0, j = 0;
char str1[] = "all \a about \t programming";
char str2[] = "Runoob \n tutorials";
/* 输出字符串直到控制字符 \a */
while (!iscntrl(str1[i]))
{
putchar(str1[i]);
i++;
}
/* 输出字符串直到控制字符 \n */
while (!iscntrl(str2[j]))
{
putchar(str2[j]);
j++;
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# int isdigit(int c)
- 描述:
int isdigit(int c);检查所传的字符是否是十进制数字字符,0 1 2 3 4 5 6 7 8 9 - 声明:
int isdigit(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是一个数字,则该函数返回非零值,否则返回0 - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 'h';
int var2 = '2';
if (isdigit(var1))
{
printf("var1 = |%c| 是一个数字\n", var1);
}
else
{
printf("var1 = |%c| 不是一个数字\n", var1);
}
if (isdigit(var2))
{
printf("var2 = |%c| 是一个数字\n", var2);
}
else
{
printf("var2 = |%c| 不是一个数字\n", var2);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# int isgraph(int c)
- 描述:
int isgraph(int c);检查所传的字符是否有图形表示法,带有图形表示法的字符是除了空白字符(比如' ')以外的所有可打印的字符 - 声明:
int isgraph(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c有图形表示法,则该函数返回非零值,否则返回0 - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = '3';
int var2 = 'm';
int var3 = ' ';
if (isgraph(var1))
{
printf("var1 = |%c| 是可打印的\n", var1);
}
else
{
printf("var1 = |%c| 是不可打印的\n", var1);
}
if (isgraph(var2))
{
printf("var2 = |%c| 是可打印的\n", var2);
}
else
{
printf("var2 = |%c| 是不可打印的\n", var2);
}
if (isgraph(var3))
{
printf("var3 = |%c| 是可打印的\n", var3);
}
else
{
printf("var3 = |%c| 是不可打印的\n", var3);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

以下实例打印所有图形字符:
#include <stdio.h>
#include <ctype.h>
int main()
{
int i;
printf("C 语言中所有图形字符: \n");
for (int i = 0; i < 127; i++)
{
if (isgraph(i))
{
printf("%c ", i);
}
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# int islower(int c)
- 描述:
int islower(int c)检查所传的字符是否小写字母 - 声明:
int islower(int c); - 参数:
c-- 是要检查的字符 - 返回值: 如果
c是一个小写字母,则该函数返回非零值(true),否则返回0(false) - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 'Q';
int var2 = 'q';
int var3 = '3';
if (islower(var1))
{
printf("var1 = |%c| 是小写字母\n", var1);
}
else
{
printf("var1 = |%c| 不是小写字母\n", var1);
}
if (islower(var2))
{
printf("var2 = |%c| 是小写字母\n", var2);
}
else
{
printf("var2 = |%c| 不是小写字母\n", var2);
}
if (islower(var3))
{
printf("var3 = |%c| 是小写字母\n", var3);
}
else
{
printf("var3 = |%c| 不是小写字母\n", var3);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# int isprint(int c)
- 描述:
int isprint(int c)检查所传的字符是否是可打印的,可打印字符是非控制字符的字符 - 声明:
int isprint(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是一个可打印的字符,则该函数返回非零值(true),否则返回0(false) - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 'k';
int var2 = '8';
int var3 = '\t';
int var4 = ' ';
if (isprint(var1))
{
printf("var1 = |%c| 是可打印的\n", var1);
}
else
{
printf("var1 = |%c| 不是可打印的\n", var1);
}
if (isprint(var2))
{
printf("var2 = |%c| 是可打印的\n", var2);
}
else
{
printf("var2 = |%c| 不是可打印的\n", var2);
}
if (isprint(var3))
{
printf("var3 = |%c| 是可打印的\n", var3);
}
else
{
printf("var3 = |%c| 不是可打印的\n", var3);
}
if (isprint(var4))
{
printf("var4 = |%c| 是可打印的\n", var4);
}
else
{
printf("var4 = |%c| 不是可打印的\n", var4);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# int ispunct(int c)
- 描述:
int ispunct(int c);检查所传的字符是否是标点符号字符,标点符号字符可以是非字母数字(正如isalnum中的一样)的任意图形字符(如isgraph中的一样) - 声明:
int ispunct(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是一个标点符号,则该函数返回非零值(true),否则返回0(false) - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 't';
int var2 = '1';
int var3 = '/';
int var4 = ' ';
if (ispunct(var1))
{
printf("var1 = |%c| 是标点符号字符\n", var1);
}
else
{
printf("var1 = |%c| 不是标点符号字符\n", var1);
}
if (ispunct(var2))
{
printf("var2 = |%c| 是标点符号字符\n", var2);
}
else
{
printf("var2 = |%c| 不是标点符号字符\n", var2);
}
if (ispunct(var3))
{
printf("var3 = |%c| 是标点符号字符\n", var3);
}
else
{
printf("var3 = |%c| 不是标点符号字符\n", var3);
}
if (ispunct(var4))
{
printf("var4 = |%c| 是标点符号字符\n", var4);
}
else
{
printf("var4 = |%c| 不是标点符号字符\n", var4);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# int isspace(int c)
- 描述:
int isspace(int c);检查所传的字符是否是空白字符
标准的空白字符包括:
| 字符 | 编码 | 说明 |
|---|---|---|
' ' | (0x20) | space (SPC) 空格符 |
'\t' | 0x09 | horizontal tab (TAB) 水平制表符 |
'\n' | 0x0a | newline (LF) 换行符 |
'\v' | 0x0b | vertical tab (VT) 垂直制表符 |
'\f' | 0x0c | feed (FF) 换页符 |
'\r' | 0x0d | carriage return (CR) 回车符 |
- 声明:
int isspace(int c); - 参数:
c-- 要检查的字符 - 返回值: 如果
c是一个空白字符,则该函数返回非零值(true),否则返回0(false) - 实例:
#include <stdio.h>
#include <ctype.h>
int main()
{
int var1 = 't';
int var2 = '1';
int var3 = ' ';
if (isspace(var1))
{
printf("var1 = |%c| 是空白字符\n", var1);
}
else
{
printf("var1 = |%c| 不是空白字符\n", var1);
}
if (isspace(var2))
{
printf("var2 = |%c| 是空白字符\n", var2);
}
else
{
printf("var2 = |%c| 不是空白字符\n", var2);
}
if (isspace(var3))
{
printf("var3 = |%c| 是空白字符\n", var3);
}
else
{
printf("var3 = |%c| 不是空白字符\n", var3);
}
return 0;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# int isupper(int c)
- 描述:
# int isxdigit(int c)
# int tolower(int c)
# int toupper(int c)
# C 标准库 - <errno.h>
# C 标准库 - <float.h>
# C 标准库 - <limits.h>
# C 标准库 - <locale.h>
# C 标准库 - <math.h>
# C 标准库 - <setjmp.h>
# C 标准库 - <signal.h>
# C 标准库 - <stdarg.h>
# C 标准库 - <stddef.h>
# C 标准库 - <stdio.h>
# C 标准库 - <stdlib.h>
# C 标准库 - <string.h>
# C 标准库 - <time.h>
- C 标准库 - 参考手册
- C 标准库 -
- C 标准库 -
- int isalnum(int c)
- int isalpha(int c)
- int iscntrl(int c)
- int isdigit(int c)
- int isgraph(int c)
- int islower(int c)
- int isprint(int c)
- int ispunct(int c)
- int isspace(int c)
- int isupper(int c)
- int isxdigit(int c)
- int tolower(int c)
- int toupper(int c)
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -
- C 标准库 -