碰到很奇怪的问题
string::size_type nlen = str.size(); // 得到1108
str.erase(pos, 3);
这句出错,跟踪进去,是_Split();里面得到了错误的_Len导致的。
assign(_Temp);里面的_Tr::length(_S)得到了一个788,而之前调用str.size()得到的是1108,这就导致后面
_Tr::move(_Ptr + _P0, _Ptr + _P0 + _M,
_Len - _P0 - _M)
的时候_Len - _P0 - _M的值已经为负数,经过仔细研究,发现这个字符串是一个包含/0的长字符串(其值是由DTL库从Oracle数据库中取出),1108是它真正的长度,788正好是/0所在的位置,就是说,对于这种数据,不能用string类来处理。
但是,随后我又写了一个试验程序:
string str = "测试/0;/r/nA;/r/n中文中文;/r/n<E>/r/n";
string::size_type srclen=str.size();
srclen得到4
这又说明size()方法是能处理/0的。又是一个百思不得其解。
原始串如下:
00E79C61 52 65 63 65 69 76 65 64 3A 20 66 72 6F 6D Received: from
00E79C6F 20 31 32 36 2E 63 6F 6D 20 28 5B 31 32 35 126.com ([125
00E79C7D 2E 39 31 2E 31 34 31 2E 32 31 36 5D 29 0D .91.141.216]).
00E79C8B 0A 09 62 79 20 6E 61 6E 6F 70 72 6F 62 65 . by nanoprobe
00E79C99 73 2E 63 6F 6D 20 28 38 2E 31 33 2E 31 2F s.com (8.13.1/
00E79CA7 38 2E 31 33 2E 31 29 20 77 69 74 68 20 45 8.13.1) with E
00E79CB5 53 4D 54 50 20 69 64 20 6D 30 44 36 78 48 SMTP id m0D6xH
00E79CC3 50 76 30 30 38 38 36 37 0D 0A 09 66 6F 72 Pv008867.. for
00E79CD1 20 3C 78 3E 3B 20 53 75 6E 2C 20 31 33 20 <x>; Sun, 13
00E79CDF 4A 61 6E 20 32 30 30 38 20 30 31 3A 35 39 Jan 2008 01:59
00E79CED 3A 32 32 20 2D 30 35 30 30 0D 0A 4D 65 73 :22 -0500..Mes
00E79CFB 73 61 67 65 2D 49 64 3A 20 3C 32 30 30 38 sage-Id: <2008
00E79D09 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F ______________
00E79D17 5F 5F 5F 5F 5F 38 38 36 37 40 6E 61 6E 6F _____8867@nano
00E79D25 70 72 6F 62 65 73 2E 63 6F 6D 3E 0D 0A 58 probes.com>..X
00E79D33 2D 4F 72 69 67 3A 20 5B 31 32 35 2E 39 31 -Orig: [125.91
00E79D41 2E 31 34 31 2E 32 31 36 5D 0D 0A 58 2D 41 .141.216]..X-A
00E79D4F 75 74 68 65 6E 74 69 63 61 74 69 6F 6E 2D uthentication-
00E79D5D 57 61 72 6E 69 6E 67 3A 20 6E 61 6E 6F 70 Warning: nanop
00E79D6B 72 6F 62 65 73 2E 63 6F 6D 3A 20 6E 61 6E robes.com: nan
00E79D79 6F 70 72 6F 62 20 6F 77 6E 65 64 20 70 72 oprob owned pr
00E79D87 6F 63 65 73 73 20 64 6F 69 6E 67 20 2D 62 ocess doing -b
00E79D95 73 0D 0A 46 72 6F 6D 3A 20 3D 3F 47 42 32 s..From: =?GB2
00E79DA3 33 31 32 3F 42 3F 77 4F 37 50 79 4D 6E 36 312?B?wO7PyMn6
00E79DB1 3F 3D 20 3C 6C 62 67 5F 35 32 30 40 31 32 ?= <lbg_520@12
00E79DBF 36 2E 63 6F 6D 3E 0D 0A 53 75 62 6A 65 63 6.com>..Subjec
00E79DCD 74 3A 20 3D 3F 47 42 32 33 31 32 3F 42 3F t: =?GB2312?B?
00E79DDB 79 63 2B 36 6F 37 76 6A 77 66 71 37 34 62 yc+6o7vjwfq74b
00E79DE9 7A 47 79 73 4C 4F 38 63 76 35 3F 3D 0D 0A zGysLO8cv5?=..
00E79DF7 54 6F 3A 20 78 0D 0A 43 6F 6E 74 65 6E 74 To: x..Content
00E79E05 2D 54 79 70 65 3A 20 74 65 78 74 2F 70 6C -Type: text/pl
00E79E13 61 69 6E 3B 63 68 61 72 73 65 74 3D 22 47 ain;charset="G
00E79E21 42 32 33 31 32 22 0D 0A 52 65 70 6C 79 2D B2312"..Reply-
00E79E2F 54 6F 3A 20 6C 62 67 5F 35 32 30 40 31 32 To: lbg_520@12
00E79E3D 36 2E 63 6F 6D 0D 0A 44 61 74 65 3A 20 53 6.com..Date: S
00E79E4B 75 6E 2C 20 31 33 20 4A 61 6E 20 32 30 30 un, 13 Jan 200
00E79E59 38 20 31 35 3A 30 33 3A 35 39 20 2B 30 38 8 15:03:59 +08
00E79E67 30 30 0D 0A 58 2D 50 72 69 6F 72 69 74 79 00..X-Priority
00E79E75 3A 20 33 0D 0A 58 2D 4D 61 69 6C 65 72 3A : 3..X-Mailer:
00E79E83 20 46 6F 78 4D 61 69 6C 20 34 2E 30 20 62 FoxMail 4.0 b
00E79E91 65 74 61 20 32 20 5B 63 6E 5D 0D 0A 58 2D eta 2 [cn]..X-
00E79E9F 53 70 61 6D 43 6F 70 2D 43 68 65 63 6B 65 SpamCop-Checke
00E79EAD 64 3A 20 36 36 2E 38 34 2E 32 32 2E 31 32 d: 66.84.22.12
00E79EBB 36 20 31 32 35 2E 39 31 2E 31 34 31 2E 32 6 125.91.141.2
00E79EC9 31 36 20 0D 0A 0D 0A 0D 0A 20 20 20 20 20 16 ......
00E79ED7 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E79EE5 B4 FA 20 B0 EC 20 B7 A2 20 C6 B1 28 31 33 代 办 发 票(13
00E79EF3 39 32 36 35 31 35 33 32 33 29 0D 0A 20 20 926515323)..
00E79F01 20 D3 C9 CE D2 CB F9 B4 FA B0 EC B8 F7 C0 由我所代办各.
00E79F0F E0 B7 A2 C6 B1 BF C9 CF ED CA DC B4 F3 B7 喾⑵笨上硎艽蠓
00E79F1D F9 B5 CD CB B0 3B 20 20 0D 0A 20 20 20 B4 退.; .. .
00E79F2B FA B0 EC B8 F7 B5 D8 B7 FE CE F1 C0 E0 28 旄鞯胤窭.(
00E79F39 D7 C9 D1 AF B7 D1 2C D7 A1 CB DE B7 D1 2C 咨询费,住宿费,
00E79F47 BB E1 CE F1 B7 D1 2C B9 E3 B8 E6 B7 D1 2C 会务费,广告费,
00E79F55 B7 BF D7 E2 0D 0A B7 D1 29 A3 BB B9 A4 B3 房租..费);工.
00E79F63 CC C0 E0 28 D7 B0 E4 EA B7 D1 2C C0 CD CE 汤.(装潢费,劳.
00E79F71 F1 B7 D1 2C 00 00 00 BD A8 D6 FE B0 B2 D7 穹.,...建筑安.
00E79F7F B0 29 BC B0 C9 CC C6 B7 A1 A2 C9 CC D2 B5 .)及商品、商业
00E79F8D A1 A2 B9 A4 0D 0A D2 B5 CF FA CA DB C0 E0 、工..业销售类
00E79F9B B5 C8 B7 A2 C6 B1 B0 B4 31 2E 35 25 CA D5 等发票按1.5%收
00E79FA9 B7 D1 A3 AC CD AC CA B1 D3 D0 C8 AB B9 FA 费,同时有全国
00E79FB7 B8 F7 B4 F3 B3 C7 CA D0 B9 AB CB BE B4 FA 各大城市公司代
00E79FC5 0D 0A C0 ED B5 C4 C6 B1 BE DD 3B 0D 0A D4 ..理的票据;...
00E79FD3 F6 D6 B5 CB B0 B0 B4 36 25 B4 FA BF AA 3B 鲋邓鞍.6%代开;
00E79FE1 0D 0A 20 20 20 D0 C5 D3 FE B3 D0 C5 B5 3A .. 信誉承诺:
00E79FEF CF C8 CE DE CC F5 BC FE BD BB BB F5 B8 F8 先无条件交货给
00E79FFD B9 F3 CB BE C8 B7 C8 CF BA F3 D4 D9 B8 B6 贵司确认后再付
00E7A00B BF EE 21 28 C4 FA CE DE D0 E8 0D 0A B3 D0 款!(您无需..承
00E7A019 B5 A3 C8 CE BA CE BE AD BC C3 C9 CF B5 C4 担任何经济上的
00E7A027 B7 E7 CF D5 29 0D 0A C1 AA 20 CF B5 20 C8 风险)..联 系 .
00E7A035 CB 3A 20 C0 EE CF C8 C9 FA 20 20 20 20 20 .: 李先生
00E7A043 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E7A051 20 20 20 30 32 31 2D 33 31 32 36 32 33 33 021-3126233
00E7A05F 39 20 20 0D 0A CA D6 20 20 20 20 BB FA 3A 9 ..手 机:
00E7A06D 20 31 33 39 32 36 35 31 35 33 32 33 0D 0A 13926515323..
00E7A07B 0D 0A 20 20 20 20 20 20 20 20 20 20 20 20 ..
00E7A089 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E7A097 20 20 20 20 20 20 C9 CF BA A3 BB E3 C1 FA 上海汇龙
00E7A0A5 BB E1 BC C6 CA C2 CE F1 CB F9 0D 0A 0D 0A 会计事务所....
00E7A0B3 0D 0A 00 CD CD CD CD CD CD CD CD CD CD CD ...屯屯屯屯屯.
00E7A0C1 FD FD FD FD F0 AD BA 0D F0 AD BA 0D F0 AD 瓠..瓠..瓠
00E7A0CF BA AB AB AB AB AB AB AB AB 00 00 00 00 00 韩......
00E7A0DD 00 00 00 0A 00 95 00 EE 04 EE 00 90 5D E7 ...........怾.
string::size_type nlen = str.size(); // 得到1108
str.erase(pos, 3);
这句出错,跟踪进去,是_Split();里面得到了错误的_Len导致的。
assign(_Temp);里面的_Tr::length(_S)得到了一个788,而之前调用str.size()得到的是1108,这就导致后面
_Tr::move(_Ptr + _P0, _Ptr + _P0 + _M,
_Len - _P0 - _M)
的时候_Len - _P0 - _M的值已经为负数,经过仔细研究,发现这个字符串是一个包含/0的长字符串(其值是由DTL库从Oracle数据库中取出),1108是它真正的长度,788正好是/0所在的位置,就是说,对于这种数据,不能用string类来处理。
但是,随后我又写了一个试验程序:
string str = "测试/0;/r/nA;/r/n中文中文;/r/n<E>/r/n";
string::size_type srclen=str.size();
srclen得到4
这又说明size()方法是能处理/0的。又是一个百思不得其解。
原始串如下:
00E79C61 52 65 63 65 69 76 65 64 3A 20 66 72 6F 6D Received: from
00E79C6F 20 31 32 36 2E 63 6F 6D 20 28 5B 31 32 35 126.com ([125
00E79C7D 2E 39 31 2E 31 34 31 2E 32 31 36 5D 29 0D .91.141.216]).
00E79C8B 0A 09 62 79 20 6E 61 6E 6F 70 72 6F 62 65 . by nanoprobe
00E79C99 73 2E 63 6F 6D 20 28 38 2E 31 33 2E 31 2F s.com (8.13.1/
00E79CA7 38 2E 31 33 2E 31 29 20 77 69 74 68 20 45 8.13.1) with E
00E79CB5 53 4D 54 50 20 69 64 20 6D 30 44 36 78 48 SMTP id m0D6xH
00E79CC3 50 76 30 30 38 38 36 37 0D 0A 09 66 6F 72 Pv008867.. for
00E79CD1 20 3C 78 3E 3B 20 53 75 6E 2C 20 31 33 20 <x>; Sun, 13
00E79CDF 4A 61 6E 20 32 30 30 38 20 30 31 3A 35 39 Jan 2008 01:59
00E79CED 3A 32 32 20 2D 30 35 30 30 0D 0A 4D 65 73 :22 -0500..Mes
00E79CFB 73 61 67 65 2D 49 64 3A 20 3C 32 30 30 38 sage-Id: <2008
00E79D09 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F 5F ______________
00E79D17 5F 5F 5F 5F 5F 38 38 36 37 40 6E 61 6E 6F _____8867@nano
00E79D25 70 72 6F 62 65 73 2E 63 6F 6D 3E 0D 0A 58 probes.com>..X
00E79D33 2D 4F 72 69 67 3A 20 5B 31 32 35 2E 39 31 -Orig: [125.91
00E79D41 2E 31 34 31 2E 32 31 36 5D 0D 0A 58 2D 41 .141.216]..X-A
00E79D4F 75 74 68 65 6E 74 69 63 61 74 69 6F 6E 2D uthentication-
00E79D5D 57 61 72 6E 69 6E 67 3A 20 6E 61 6E 6F 70 Warning: nanop
00E79D6B 72 6F 62 65 73 2E 63 6F 6D 3A 20 6E 61 6E robes.com: nan
00E79D79 6F 70 72 6F 62 20 6F 77 6E 65 64 20 70 72 oprob owned pr
00E79D87 6F 63 65 73 73 20 64 6F 69 6E 67 20 2D 62 ocess doing -b
00E79D95 73 0D 0A 46 72 6F 6D 3A 20 3D 3F 47 42 32 s..From: =?GB2
00E79DA3 33 31 32 3F 42 3F 77 4F 37 50 79 4D 6E 36 312?B?wO7PyMn6
00E79DB1 3F 3D 20 3C 6C 62 67 5F 35 32 30 40 31 32 ?= <lbg_520@12
00E79DBF 36 2E 63 6F 6D 3E 0D 0A 53 75 62 6A 65 63 6.com>..Subjec
00E79DCD 74 3A 20 3D 3F 47 42 32 33 31 32 3F 42 3F t: =?GB2312?B?
00E79DDB 79 63 2B 36 6F 37 76 6A 77 66 71 37 34 62 yc+6o7vjwfq74b
00E79DE9 7A 47 79 73 4C 4F 38 63 76 35 3F 3D 0D 0A zGysLO8cv5?=..
00E79DF7 54 6F 3A 20 78 0D 0A 43 6F 6E 74 65 6E 74 To: x..Content
00E79E05 2D 54 79 70 65 3A 20 74 65 78 74 2F 70 6C -Type: text/pl
00E79E13 61 69 6E 3B 63 68 61 72 73 65 74 3D 22 47 ain;charset="G
00E79E21 42 32 33 31 32 22 0D 0A 52 65 70 6C 79 2D B2312"..Reply-
00E79E2F 54 6F 3A 20 6C 62 67 5F 35 32 30 40 31 32 To: lbg_520@12
00E79E3D 36 2E 63 6F 6D 0D 0A 44 61 74 65 3A 20 53 6.com..Date: S
00E79E4B 75 6E 2C 20 31 33 20 4A 61 6E 20 32 30 30 un, 13 Jan 200
00E79E59 38 20 31 35 3A 30 33 3A 35 39 20 2B 30 38 8 15:03:59 +08
00E79E67 30 30 0D 0A 58 2D 50 72 69 6F 72 69 74 79 00..X-Priority
00E79E75 3A 20 33 0D 0A 58 2D 4D 61 69 6C 65 72 3A : 3..X-Mailer:
00E79E83 20 46 6F 78 4D 61 69 6C 20 34 2E 30 20 62 FoxMail 4.0 b
00E79E91 65 74 61 20 32 20 5B 63 6E 5D 0D 0A 58 2D eta 2 [cn]..X-
00E79E9F 53 70 61 6D 43 6F 70 2D 43 68 65 63 6B 65 SpamCop-Checke
00E79EAD 64 3A 20 36 36 2E 38 34 2E 32 32 2E 31 32 d: 66.84.22.12
00E79EBB 36 20 31 32 35 2E 39 31 2E 31 34 31 2E 32 6 125.91.141.2
00E79EC9 31 36 20 0D 0A 0D 0A 0D 0A 20 20 20 20 20 16 ......
00E79ED7 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E79EE5 B4 FA 20 B0 EC 20 B7 A2 20 C6 B1 28 31 33 代 办 发 票(13
00E79EF3 39 32 36 35 31 35 33 32 33 29 0D 0A 20 20 926515323)..
00E79F01 20 D3 C9 CE D2 CB F9 B4 FA B0 EC B8 F7 C0 由我所代办各.
00E79F0F E0 B7 A2 C6 B1 BF C9 CF ED CA DC B4 F3 B7 喾⑵笨上硎艽蠓
00E79F1D F9 B5 CD CB B0 3B 20 20 0D 0A 20 20 20 B4 退.; .. .
00E79F2B FA B0 EC B8 F7 B5 D8 B7 FE CE F1 C0 E0 28 旄鞯胤窭.(
00E79F39 D7 C9 D1 AF B7 D1 2C D7 A1 CB DE B7 D1 2C 咨询费,住宿费,
00E79F47 BB E1 CE F1 B7 D1 2C B9 E3 B8 E6 B7 D1 2C 会务费,广告费,
00E79F55 B7 BF D7 E2 0D 0A B7 D1 29 A3 BB B9 A4 B3 房租..费);工.
00E79F63 CC C0 E0 28 D7 B0 E4 EA B7 D1 2C C0 CD CE 汤.(装潢费,劳.
00E79F71 F1 B7 D1 2C 00 00 00 BD A8 D6 FE B0 B2 D7 穹.,...建筑安.
00E79F7F B0 29 BC B0 C9 CC C6 B7 A1 A2 C9 CC D2 B5 .)及商品、商业
00E79F8D A1 A2 B9 A4 0D 0A D2 B5 CF FA CA DB C0 E0 、工..业销售类
00E79F9B B5 C8 B7 A2 C6 B1 B0 B4 31 2E 35 25 CA D5 等发票按1.5%收
00E79FA9 B7 D1 A3 AC CD AC CA B1 D3 D0 C8 AB B9 FA 费,同时有全国
00E79FB7 B8 F7 B4 F3 B3 C7 CA D0 B9 AB CB BE B4 FA 各大城市公司代
00E79FC5 0D 0A C0 ED B5 C4 C6 B1 BE DD 3B 0D 0A D4 ..理的票据;...
00E79FD3 F6 D6 B5 CB B0 B0 B4 36 25 B4 FA BF AA 3B 鲋邓鞍.6%代开;
00E79FE1 0D 0A 20 20 20 D0 C5 D3 FE B3 D0 C5 B5 3A .. 信誉承诺:
00E79FEF CF C8 CE DE CC F5 BC FE BD BB BB F5 B8 F8 先无条件交货给
00E79FFD B9 F3 CB BE C8 B7 C8 CF BA F3 D4 D9 B8 B6 贵司确认后再付
00E7A00B BF EE 21 28 C4 FA CE DE D0 E8 0D 0A B3 D0 款!(您无需..承
00E7A019 B5 A3 C8 CE BA CE BE AD BC C3 C9 CF B5 C4 担任何经济上的
00E7A027 B7 E7 CF D5 29 0D 0A C1 AA 20 CF B5 20 C8 风险)..联 系 .
00E7A035 CB 3A 20 C0 EE CF C8 C9 FA 20 20 20 20 20 .: 李先生
00E7A043 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E7A051 20 20 20 30 32 31 2D 33 31 32 36 32 33 33 021-3126233
00E7A05F 39 20 20 0D 0A CA D6 20 20 20 20 BB FA 3A 9 ..手 机:
00E7A06D 20 31 33 39 32 36 35 31 35 33 32 33 0D 0A 13926515323..
00E7A07B 0D 0A 20 20 20 20 20 20 20 20 20 20 20 20 ..
00E7A089 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00E7A097 20 20 20 20 20 20 C9 CF BA A3 BB E3 C1 FA 上海汇龙
00E7A0A5 BB E1 BC C6 CA C2 CE F1 CB F9 0D 0A 0D 0A 会计事务所....
00E7A0B3 0D 0A 00 CD CD CD CD CD CD CD CD CD CD CD ...屯屯屯屯屯.
00E7A0C1 FD FD FD FD F0 AD BA 0D F0 AD BA 0D F0 AD 瓠..瓠..瓠
00E7A0CF BA AB AB AB AB AB AB AB AB 00 00 00 00 00 韩......
00E7A0DD 00 00 00 0A 00 95 00 EE 04 EE 00 90 5D E7 ...........怾.