作者gamerred (game859)
看板EE_DSnP
标题[建议] myStrNCmp in util/myString.cpp
时间Fri Oct 28 08:18:38 2011
第 30 行
...
29
for (
unsigned i =
0; i < l; ++i ) {
30
>> if (!s2[i])
31
return (i < n)?
1:
0;
...
这行应该是要判断 string s2 有没有到结尾吧
但是这个用法不对
显然我们期待在字串结尾处有'\0'字元
但是在我们期待'\0'存在的地方已经超出string的范围了
string 的 operator[] 是不能dereference超过 size 长度的
如果超出长度 虽然他不会检查 但是会有潜在的危险
string 的标准中没有规定必须以结尾字元'\0' 结尾
所以每个library 可能提供不同的实作
即使某些实作版本中真的有'\0'在那个位置
也不该期待在那个地方永远会有结尾字元
这会降低程式码的可携性
请参考 string 的 member function c_str() 还有 data() 和 operator[]
http://www.cplusplus.com/reference/string/string/operator[]/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.247.241
1F:推 wmin0:有道理 10/28 09:48
3F:→ wmin0:这个似乎保险一点 10/28 09:52
at() 函式确保了安全,但是也牺牲了效率
operator[] 里面不检查范围的原因就是为了速度!
确保范围的责任就交给程式设计师了
4F:推 vuluy:可是at丢出的exception是什麽意思呢,是会终止程式吗?? 10/28 09:57
例外处理(exception)是为了处理非正常程序执行时会遇到的状况
典型的例子就是"除以零例外"(DevideByZeroException)
不过他不是预设的例外之一XD
例外处理将在做适当处理後 1.继续执行(fault-tolerant) 或
2.终止程式(gracefully degrade)
而不是不负责任的直接呼叫abort()留下烂摊给OS收拾
详情请参考蚂蚁书 exception 章节
5F:推 djshen:把string的字尾改掉 cout string的话会是原本的 但是 10/28 09:57
6F:→ djshen:data()就会连後面的一起印出来 10/28 09:58
尝试印出未定义记忆体空间是非法的行为
这就像是故意开一个未以'\0'结尾的字元字串 然後印出一样
而前面第一个状况是因为 string 内部可以用别的变数来记录size
如此一来就不需要用到结尾字元来表示字串的结束
7F:→ djshen:at如果超过范围好像会直接停止耶@@ 10/28 10:11
※ 编辑: gamerred 来自: 140.112.247.241 (10/28 13:20)
※ 编辑: gamerred 来自: 140.112.247.241 (10/28 13:22)
8F:→ djshen:我也是想说用size来看 10/28 13:44
9F:→ djshen:string好像会在後面多留一点空间 所以改那个空间里的东西 10/28 18:48
10F:→ djshen:然後用data()去access应该不算是去动到未定义空间吧? 10/28 18:50
11F:→ djshen:不过印出string是由size控制而不是'\0'是可以确定的@@ 10/28 18:56
12F:推 ric2k1:Very good point! I should have used s2.size() instead 10/28 19:09
13F:→ ric2k1:of s2[i] to check string end. Will correct this in 10/28 19:09
14F:→ ric2k1:future homework. 这个作业应该没有影响。 10/28 19:10
15F:→ djshen:发现有些状况的确会有非法存取的问题.. 10/28 19:46