【叶子函数分享五十八】固定长度添加分隔符函数

本文介绍了C语言中扩展的一个功能,即如何创建一个允许用户自定义分隔符的固定长度插入函数。该函数能够根据设定的长度在字符串中插入指定的分隔符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-- =============================================
-- Author:      maco_wang
-- Create date: 2012-01-08
-- Description:	固定长度添加分隔符函数
-- =============================================

create function AddSplitSign
(
	@colname varchar(8000),
    @len int  --固定长度
)
returns varchar(8000)
as
begin
    declare @j int set @j=ceiling(len(@colname)/(@len*1.0))-1
    while(@j>0)
        begin
            set @colname=stuff(@colname,@len*@j+1,0,'-')
            set @j=@j-1
        end
    return @colname
end


declare @T table (col varchar(36))
insert into @T
select 'AEB3166C-B7C6-4C5D-BF0B-F452626EF266' union all
select '79EA0FFB-7BF5-4F49-BEC4-E0C6F5ADC3AB' union all
select '5B7B59AF-AF2A-4CB1-8CCC-27AB75A6A845' union all
select 'B829A0A2-6B08-42F0-86B3-69D276664579' union all
select '0F0E1FCC-3256-4364-9FE8-80B180A9C6FB' union all
select '5C3D3CED-C650-4E8D-AF16-0870D0500581' union all
select '9B2C0A05-46CE-4CFE-85FB-E6C460C5C771' union all
select '79F6DE39-BEC5-4D55-8A67-021FD8C72280' union all
select 'E163704D-0248-4AD1-B4E5-FDC374B60304' union all
select 'D8A1B062-CC90-41F9-A359-108263C7CF47' union all
select '9A2227ED-C2D8-4BDD-B2C9-182485E659C9'

--将表中-去掉,然后每4个一分割
select col=dbo.AddSplitSign(replace(col,'-',''),4) from @T

--查看结果
/*
col
---------------------------------------
AEB3-166C-B7C6-4C5D-BF0B-F452-626E-F266
79EA-0FFB-7BF5-4F49-BEC4-E0C6-F5AD-C3AB
5B7B-59AF-AF2A-4CB1-8CCC-27AB-75A6-A845
B829-A0A2-6B08-42F0-86B3-69D2-7666-4579
0F0E-1FCC-3256-4364-9FE8-80B1-80A9-C6FB
5C3D-3CED-C650-4E8D-AF16-0870-D050-0581
9B2C-0A05-46CE-4CFE-85FB-E6C4-60C5-C771
79F6-DE39-BEC5-4D55-8A67-021F-D8C7-2280
E163-704D-0248-4AD1-B4E5-FDC3-74B6-0304
D8A1-B062-CC90-41F9-A359-1082-63C7-CF47
9A22-27ED-C2D8-4BDD-B2C9-1824-85E6-59C9

(11 row(s) affected)
*/

上面的函数有个问题,分隔符不能自定义,扩展一下

--固定长度添加分隔符函数
create function [AddSplitSignV2.0]
(
	@colname varchar(8000),
    @len int,  --固定长度
    @sign varchar(10)
)
returns varchar(8000)
as
begin
    declare @j int set @j=ceiling(len(@colname)/(@len*1.0))-1
    while(@j>0)
        begin
            set @colname=stuff(@colname,@len*@j+1,0,@sign)
            set @j=@j-1
        end
    return @colname
end


declare @T table (col varchar(36))
insert into @T
select 'AEB3166C-B7C6-4C5D-BF0B-F452626EF266' union all
select '79EA0FFB-7BF5-4F49-BEC4-E0C6F5ADC3AB' union all
select '5B7B59AF-AF2A-4CB1-8CCC-27AB75A6A845' union all
select 'B829A0A2-6B08-42F0-86B3-69D276664579' union all
select '0F0E1FCC-3256-4364-9FE8-80B180A9C6FB' union all
select '5C3D3CED-C650-4E8D-AF16-0870D0500581' union all
select '9B2C0A05-46CE-4CFE-85FB-E6C460C5C771' union all
select '79F6DE39-BEC5-4D55-8A67-021FD8C72280' union all
select 'E163704D-0248-4AD1-B4E5-FDC374B60304' union all
select 'D8A1B062-CC90-41F9-A359-108263C7CF47' union all
select '9A2227ED-C2D8-4BDD-B2C9-182485E659C9'

--将表中"-"去掉,然后每间隔4个字符添加一个":"分割符
select col=dbo.[AddSplitSignV2.0](replace(col,'-',''),4,':') from @T

--查看结果
/*
col
---------------------------------------
AEB3:166C:B7C6:4C5D:BF0B:F452:626E:F266
79EA:0FFB:7BF5:4F49:BEC4:E0C6:F5AD:C3AB
5B7B:59AF:AF2A:4CB1:8CCC:27AB:75A6:A845
B829:A0A2:6B08:42F0:86B3:69D2:7666:4579
0F0E:1FCC:3256:4364:9FE8:80B1:80A9:C6FB
5C3D:3CED:C650:4E8D:AF16:0870:D050:0581
9B2C:0A05:46CE:4CFE:85FB:E6C4:60C5:C771
79F6:DE39:BEC5:4D55:8A67:021F:D8C7:2280
E163:704D:0248:4AD1:B4E5:FDC3:74B6:0304
D8A1:B062:CC90:41F9:A359:1082:63C7:CF47
9A22:27ED:C2D8:4BDD:B2C9:1824:85E6:59C9

(11 row(s) affected)

*/


题目要求 1. 输入 从键盘输入一个字符串(长度≤1000),包含大小写字母、数字、标点符号(如 !@#$%^&())及空格。 注意:字符区分大小写(A与a视为不同字符)。 2. 处理规则 (1) 频率统计 统计每个字符的出现次数。 (2) 霍夫曼树构造规则(确保唯一性) 优先队列排序规则: 节点按频率升序排列。 同频率时,按字符的ASCII码升序排列(ASCII小的优先合并)。 合并后的内部节点视为一个子树,其ASCII码值为子树中所有叶子节点的最小ASCII码。 合并顺序:每次从队列头部取出两个节点,左子树为ASCII码较小的节点或子树,右子树为较大的。 路径分配规则:左分支编码为 0,右分支为 1。 3. 输出 字符频率统计表:按ASCII码升序输出(如 ! 的ASCII为33,排在 0(ASCII 48)之前)。 霍夫曼编码表:按ASCII码升序输出字符及其编码。 编码结果:将输入字符串转为二进制编码流(连续输出,无分隔符)。 译码验证:将编码结果还原为原始字符串,验证一致性。 测试样例1:不同频率的字符 输入: "abc" 输出: 字符频率统计表: a 1 b 1 c 1 霍夫曼编码表: a 00 b 01 c 1 编码结果: 00011 译码验证结果:一致 测试样例2:同频率字符,不同ASCII码 输入: "abaB" 输出: 字符频率统计表: B 1 a 2 b 1 霍夫曼编码表: B 00 a 1 b 01 编码结果: 101100 译码验证结果:一致 测试样例3:特殊字符与数字 输入: "!0" 输出: 字符频率统计表: ! 1 0 1 霍夫曼编码表: ! 0 0 1 编码结果: 01 译码验证结果:一致 测试样例4:混合大小写与空格 输入: "aA " 输出: 字符频率统计表: 1 A 1 a 1 霍夫曼编码表: 00 A 01 a 1 编码结果: 10100 译码验证结果:一致 要求: 1. 程序尽可能加详细注释2.使用c++实现
最新发布
04-02
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值