我基本上是在尝试将数组中某个索引之后的所有内容都存储在该数组中。
例如,我想存储一个声明为 char name[10]
的名称。如果用户输入15
字符,它将忽略前五个字符并将其余字符存储在 char 数组中,但是,我的程序崩溃了。
这是我的代码
char name[10];
cout<< "Starting position:" << endl;
cin >> startPos;
for(int i= startPos; i< startPos+10; i++)
{
cout << i << endl; // THIS WORKS
cout << i-startPos << endl; // THIS WORKS
name[i-startPos] = name[i]; // THIS CRASHES
}
例如,如果我的名字是 McStevesonse
,我希望程序只存储第 3 个位置的所有内容,因此最终结果是Stevesonse
如果有人能帮助我修复此崩溃,我将不胜感激。
谢谢
假设i
等于3。在循环的最后一次迭代中,i
现在等于 12,因此将 12 替换为 i
,您的最后一行为
name[12-startPos] = name[12];
name[12]
超出了数组的范围。根据您到目前为止所展示的内容,在开始执行此任务之前,无论如何,name
中都只有垃圾存储,因此您所做的只是重新组织数组中的垃圾。
请以后:发布完整的可编译示例。一个简单的答案是,您的数组可能超出范围,因为您没有提供完整的示例,因此很难确切知道。
这是一个工作示例:
#include <iostream>
using namespace std;
int main() {
int new_length, startPos;
int length = 15;
char name[15]= "McStevesonse";
cout<< "Starting position:" << endl;
cin >> startPos;
if(new_length <1){ // you need to check for negative or zero value!!!
cout << "max starting point is " <<length-1 << endl;
return -1;
}
new_length=length-startPos;
char newname[new_length];
for(int i= 0; i<new_length; i++){
newname[i] = name[i+startPos]; // THIS CRASHES
}
cout << "old name: " << name << " new name: " << newname << endl;
return 0 ;
}
简单地说,改变这个:
for(int i= startPos; i< startPos+10; i++)
对此:
for(int i= startPos; i<10; i++)
你应该没问题。
解释:
在某些时候,当您使用旧循环时,此name[i-startPos] = name[i]
最终会超出边界到达数组索引并导致崩溃。
不要忘记清理/隐藏垃圾:
这样做会导致输出产生某种垃圾输出。如果你得到一个字符数组 'ABCDEFGHIJ'
,并选择 3 作为起始位置,则该数组将被排列为 'DEFGHIJHIJ'
。在输出中,您至少应该隐藏多余的字符,或者通过放置