字符串处理

字符串输入输出

设备输出stdout、设备键盘输入stdin、设备错误显示stderr。

常用的字符串输入函数有putchar()、puts()、fputc()、fputs()只能输出字符串函数,不像printf可以格式化输出,所以一般用printf。

puts函数原型可通过man 3 puts查看。

使用 puts()函数连换行符’ \n ‘都省了,函数内部会自动在其后添加一个换行符。

putchar函数原型可通过man 3 putchar查看。

putchar()函数可以把参数 c 指定的字符(一个无符号字符)输出到标准输出设备,其输出可以是一个字符,可以是介于 0~127 之间的一个十进制整型数(包含 0 和 127,输出其对应的 ASCII 码字符),也可以是用 char 类型定义好的一个字符型变量。

fputc函数原型可通过man 3 fputc查看

fputc()与 putchar()类似,也用于输出参数 c 指定的字符(一个无符号字符),与 putchar()区别在于,putchar()只能输出到标准输出设备,而 fputc()可把字符输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。

fputs

fputs()与 puts()类似,也用于输出一条字符串,与 puts()区别在于,puts()只能输出到标准输出设备,而 fputs()可把字符串输出到指定的文件中,既可以是标准输出、标准错误设备,也可以是一个普通文件。

内存填充

在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0。

memset函数用于将某一块内存的数据全部设置为指定的值

1
2
#include <string.h>
void *memset(void *s, int c, size_t n);

s:需要进行数据填充的内存空间起始地址。
c:要被设置的值,该值以 int 类型传递。但在使用过程中是以无符号字符形式
n:填充的字节数。

bzero函数用于将一块内存的数据都设置为0

1
2
#include <strings.h>
void bzero(void *s, size_t n);

s:内存空间的起始地址。
n:填充的字节数。
返回值:无返回值。

Linux正则表达式

正则表达式,又称为规则表达式(英语: Regular Expression),正则表达式通常被用来检索、替换那些符合某个模式(规则)的字符串,正则表达式描述了一种字符串的匹配模式(pattern),可以用来检查一个给定的字符串中是否含有某种子字符串、将匹配的字符串替换或者从某个字符串中取出符合某个条件的子字符串。

正则表达式其实也是一个字符串,该字符串由普通字符(譬如,数字 0~9、大小写字母以及其它字符)和特殊字符(称为“元字符”)所组成,由这些字符组成一个“规则字符串”,这个“规则字符串”用来表达对给定字符串的一种查找、匹配逻辑。

正则表达式 菜鸟教程

C语言中使用正则表达式一般分为三步:

1.编译正则表达式regcomp()

2匹配正则表达式regexec()

3释放正则表达式regfree()

1
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
67
68
69
70
71
72
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <regex.h>
#include <string.h>
int main(int argc, char *argv[])
{
regmatch_t pmatch = {0};
regex_t reg;
char errbuf[64];
int ret;
char *sptr;
int length;
int nmatch; //最多匹配出的结果
if (4 != argc)
{
/**********************************
* 执行程序时需要传入两个参数:
* arg1: 正则表达式
* arg2: 待测试的字符串
* arg3: 最多匹配出多少个结果
**********************************/
fprintf(stderr, "usage: %s <regex> <string> <nmatch>\n", argv[0]);
exit(0);
}
if(ret = regcomp(&reg, argv[1], REG_EXTENDED))
{
regerror(ret, &reg, errbuf, sizeof(errbuf));
fprintf(stderr, "regcomp error: %s\n", errbuf);
exit(0);
}
/* 赋值操作 */
sptr = argv[2]; //待测试的字符串
length = strlen(argv[2]);//获取字符串长度
nmatch = atoi(argv[3]); //获取最大匹配数
/* 匹配正则表达式 */
for (int j = 0; j < nmatch; j++)
{
char temp_str[100];
/* 调用 regexec 匹配正则表达式 */
if(ret = regexec(&reg, sptr, 1, &pmatch, 0))
{
regerror(ret, &reg, errbuf, sizeof(errbuf));
fprintf(stderr, "regexec error: %s\n", errbuf);
goto out;
}
if(-1 != pmatch.rm_so)
{
if (pmatch.rm_so == pmatch.rm_eo)
{//空字符串
sptr += 1;
length -= 1;
printf("\n"); //打印出空字符串
if (0 >= length)//如果已经移动到字符串末尾、则退出
break;
continue; //从 for 循环开始执行
}
memset(temp_str, 0x00, sizeof(temp_str));//清零缓冲区
memcpy(temp_str, sptr + pmatch.rm_so,
pmatch.rm_eo - pmatch.rm_so);//将匹配出来的子字符串拷贝到缓冲区
printf("%s\n", temp_str); //打印字符串
sptr += pmatch.rm_eo;
length -= pmatch.rm_eo;
if (0 >= length)
break;
}
}
/* 释放正则表达式 */
out:
regfree(&reg);
exit(0);
}