特定情况下,以下的写法导致最后一个单引号没加上:
写法1:
string
strSQL;
strSQL
=
"
WHERE APPEAL_DISPLAY='
"
;
strSQL.append(display);
strSQL.append(
"
'
"
);
写法2:
string
strSQL
=
"
WHERE
APPEAL_
DISPLAY='
"
+
display
+
"
'
"
;
写法3:
string
strSQL
=
"
WHERE
APPEAL_
DISPLAY='
"
+
display
+
" /
'
"
;
以下写法不出此问题:
char
szSQL[
256
]
=
{0}
;
string
strSQL;
sprintf(szSQL,
"
WHERE APPEAL_DISPLAY='%s'
"
, display.c_str() );
strSQL
=
szSQL;
调试之前执行了Clean+Rebuild,VC6,操作系统是Win2003,但是另外写一个工程运行上述代码就不出错。
出错的时候display的内存情况:
02083E31
67
7A
44
53
4C
38
37
32
35
36
35
31
31
00
00
gzDSL87256511..
strSQL的内存:
02080A61
57
48
45
52
45
20
41
50
50
45
41
4C 5F
44
49
WHERE APPEAL_DI
02080A70
53
50
4C
41
59
3D
27
67
7A
44
53
4C
38
37
32
SPLAY
=
'
gzDSL872
02080A7F
35
36
35
31
31
00
00
00
00
00
00
00
00
00
00
56511
..........
又经过试验,发现display.size() 为256 !所以想象可能还是类似上次的包含/0的问题。
追查display的来源如下:
display = CTAppeal.GetExtenNum();
按想象string不能保存包含/0的字符串,
再次测试:
经过测试:
const
std::
string
display
=
"
sgsg8176216/0/0/0/0
"
;
int
a
=
display.size();
a==11
string是不会被直接赋值为一个包含/0的字符串的。但是,这里有个问题,就是这样赋值的话应该是被编译器给截断的。所以内存赋值可能string实际可以支持。GetExtenNum()是输出数据库字段的值然后返回,其间也是用string保存数据的,dtl库的内部实现我并不了解,但推测应该还是字符串
(2008-05-21 12:03:00) pyw(4073351)
写法1:




写法2:

写法3:

以下写法不出此问题:




调试之前执行了Clean+Rebuild,VC6,操作系统是Win2003,但是另外写一个工程运行上述代码就不出错。
出错的时候display的内存情况:

strSQL的内存:



又经过试验,发现display.size() 为256 !所以想象可能还是类似上次的包含/0的问题。
追查display的来源如下:
display = CTAppeal.GetExtenNum();
按想象string不能保存包含/0的字符串,
再次测试:



a==11
string是不会被直接赋值为一个包含/0的字符串的。但是,这里有个问题,就是这样赋值的话应该是被编译器给截断的。所以内存赋值可能string实际可以支持。GetExtenNum()是输出数据库字段的值然后返回,其间也是用string保存数据的,dtl库的内部实现我并不了解,但推测应该还是字符串
(2008-05-21 12:03:00) pyw(4073351)