实验程序是用vc6编译,一定注意文件扩展名为c,不是cpp,下载前面几个测试程序(链表、表、原子中有下载链接)中直接将下面源程序覆盖1.c的内容即可!
再次强烈建议在这些接口函数上设上断点,按F11跟进去把源码走一遍!才会获得大师们真正的深刻思想
源程序如下:
#include <stdio.h>
#include <string.h>
#include "include/Str.h"
#include "include/fmt.h"
#pragma comment(lib, "libcii.lib")
void main()
{
//注意:C语言一定要将这些变量声明放在函数的头部
char str1[] = {'a', 'b'};
char str2[] = "0123456789";
char *strOut = NULL;
int n = 0;
printf("%d\n", sizeof(str1)); //输出2
printf("%d\n", sizeof('a')); //输出4,单字符常数的类型为int!!验证P172中间
printf("%c\n", "012345678ABCDEF"[2]);//注意这种用法
//
// 取字串
// 注意:所使用的数字是“位置”,而不是“下标”(索引)!!,位置的定义见P174说明
// “位置”转换到“索引”是靠convert(s, i, j);或者idx()完成,参考源码
//
strOut = Str_sub(str2, 0, 3);
printf("Str_sub = %s, %08x\n", strOut, strOut);
//
// 复制串
//
strOut = Str_dup(str2, 1, 0, 1);
printf("Str_dup = %s, %08x\n", strOut, strOut);
//
// 复制串
//
strOut = Str_catv(str2, 0, 1, "ABCDE", 1, 0, NULL);
printf("Str_catv = %s, %08x\n", strOut, strOut);
//
// 反转串
//
strOut = Str_reverse(str2, 1, 0);
printf("Str_catv = %s, %08x\n", strOut, strOut);
//
// 映射串
//
strOut = Str_map("ABC", 1, 0, "ABC", "XYZ");
printf("Str_map = %s, %08x\n", strOut, strOut);
//
// 位置
// “位置”-1 就是“索引”
//
n = Str_pos("ABC", -1);
printf("Str_pos = %d\n", n);
//
// 长度
//
n = Str_len("ABC", 1, 0);
printf("Str_len = %d\n", n);
//
// 串比较
//
n = Str_cmp("ABC", 1, 0, "XYZ", 1, 0);
printf("Str_cmp = %d\n", n); //"ABC"<"XYZ"
//
// 查找字符
//
n = Str_chr(str2, 1, 0, '1');
printf("Str_chr = %d\n", n);
n = Str_rchr(str2, 1, 0, '1');
printf("Str_chr = %d\n", n);
//
// 查找字符集合
// 最后一个参数为“任意字符的集合”,对于下面集合,适合‘0’出现的第一个位置为1!!
//
n = Str_upto(str2, 1, 0, "TUDX05");
printf("Str_upto = %d\n", n);
//
// 查找字串
//
n = Str_find(str2, 1, 0, "89");
printf("Str_find = %d\n", n);
//
// 第一个参数是一个串,第二个参数是“位置+1”,最后一个为一个集合
// 下面的意思是字符‘4’出现在“427”中的位置+1,是2(不是集合的位置+1)
// 不明白这个函数为何这样设计??
// ①第一第二参数为何不合并为一个字符,②返回的是位置+1
//
n = Str_any("427", 1, str2);
printf("Str_any = %d\n", n);
//
//下面的意思是,"27"集合(1,0表达了全部集合)在str2中的出现的位置,就是3
//
n = Str_many("27", 1, 0, str2);
printf("Str_many = %d\n", n);
//
//下面的意思是,在str2中匹配"0123",返回str2的下一个位置(不是索引),是5
//
n = Str_match(str2, 1, 0, "0123");
printf("Str_match = %d\n", n);
//
// 转换函数
// 下面的意思见《《C语言接口与实现》实验——格式化(Fmt_T)》
//
Fmt_register('&', Str_fmt);
Fmt_print("Str_fmt = %&\n", str2, 0, 1);
}
输出:
2
4
2
Str_sub = 23456789, 00380fe0
Str_dup = 0123456789, 00381018
Str_catv = 0123456789ABCDE, 00381050
Str_catv = 9876543210, 00381098
Str_map = XYZ, 003810d0
Str_pos = 3
Str_len = 3
Str_cmp = -1
Str_chr = 2
Str_chr = 2
Str_upto = 1
Str_find = 9
Str_any = 2
Str_many = 3
Str_match = 5
Str_fmt = 0123456789
Press any key to continue