问题来源: B组 PAT1057 PAT1079
两个样例:
PAT1057:
//char two[10000];
//string two = new string[100];
string two;
int i = 0;
while (sum != 0) {
two[i++] = sum % 2 + '0';
sum /= 2;
}
PAT1079:
string s;
int up = 0;
int sum = 0;
int k = 0;
for (int i = s1.size() - 1; i >= 0; i--) {
sum = s1[i] - '0' + s2[i] - '0';
//运行时报错: string subscript out of range
s[k++]=((sum + up) % 10 + '0');
up = (sum + up) / 10;
}
相关资料:
查阅后,细看了这个链接,初步解决问题:(7条消息) c++程序运行时出现string subscript out of range--CSDN问答
总结与思考:
1.string subscript out of range: 即字符串边界溢出
溢出: 对string s未初始化,如果要对s进行操作,需对s进行初始化,给其分配相应的存储空间
初始化: 为string变量分配内存空间 (没有空间,谈何操作)
通俗解释: 存在string s的空间大小在访问下标为k=0的数组元素时,都无法正常访问的可能性
2.string是动态分配类型,问题转为: 动态分配类型变量未初始强行以下标形式访问元素
首先,明确string的动态分配不是根据下标分配,而是所储存的数据大小
而,下标访问操作是动态分配的空间大小确定后才能进行的操作
插入内容: 动态内存类型可以根据插入内容的大小调控其空间
string虽然是动态内存,但不会自动分配所需空间,如果未对string插入内容,下标访问操作就
会报错,故需要先让string分配到所需大小的空间
3.string动态分配内存的三种方式
1. insert函数 2. += 3. =" "
4.对小标题2也可以这么理解:
string s;
char c;
s.insert(c);
s+=c;
s="动态分配内存的三种方式";
代码块内的三种操作是先有赋值(插入)操作(的意图), 后根据赋值(插入)大小动态调控空间, 最后输入值成功插入(访问)刚分配的空间
而,下面的代码:
#define MAX 100
string s;
char c;
for(int i=0;i<MAX;i++){
s[i]=c;
}
是先去访问下标为i的位置的空间, 然后向该空间进行赋值操作, 但因为s未初始化,下标i对应的空间自然没有被分配, 导致赋值操作无法正常进行, 即没有空间去放置输入的元素, 发生溢出