首页 > C++编程 > 说一说string::size_type这个类型

说一说string::size_type这个类型

其实以前我都不用这些XXX::size_type之类的类型的,一般都用int;后来看书看多了,就想还是用一下size_type;再后来,就发现问题了,于是我又用回了int来充当下标之类的类型。

问题是这样的,看看下面的代码有没有什么问题:

// 重点看for循环,里面的if可以忽略
int getValue(const string& str)
{
	int res = 0, j = 0;
	for (string::size_type i = str.size() - 1; i >= 0; --i)
	{
		if (str[i] >= '0' && str[i] <= '9')
		{
			res += pow10[j++] * (str[i] - '0');
		}
	}
	return str[0] == '-' ? (res * (-1)) : res;
}

似乎也没什么问题,不过一运行那是会出错的,至于为什么会错呢?看看string::size_type是如何定义的:

The unsigned integral type for size values and indices.
It is equivalent to allocator_type::size_type.
For type string, it is equivalent to size_t.

到此,问题的原因也就出来了,size_t是个无符号类型,当i等于0时,如果i再进行自减操作,那么会得到什么?一个很大的数了,至于会是什么,可以研究下(是0xFFFFFFFF,不多说了,很简单),这样,就会在使用str[i]越界,这里会导致未定义的行为,往往是程序的终止。(如果采用str.at[i]的方式读取,会跑出out_of_range异常)
VC++断言
注意这个图不是异常,是运行库的ASSERT提交校验没通过。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 说一说string::size_type这个类型
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: C++编程 标签: ,
  1. nervending
    2011年12月12日10:07 | #1

    一般迭代都使用迭代器,size_type确实有这个问题,之前自己都没有想到,因为我一直用迭代器。。。

    [回复]

    代码疯子 回复:

    @nervending, 还是用迭代器好

    [回复]

  2. NewbieCoder
    2012年8月19日15:05 | #2

    for (string::size_type i = str.size() – 1; i >= 0; –i)

    前一阵给某个OJ加题的时候,某标程就疯狂的RE,后来就在代码中看到了这句话

    [回复]