我基本上试图将所有内容存储在数组中的某个索引之后。
例如,我想存储一个声明为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
如果有人能帮助我解决此次崩溃,我将非常感激。
由于
答案 0 :(得分:1)
假设i
等于3.在循环的最后一次迭代中,i
现在等于12,所以用12代替i
,你的最后一行读取
name[12-startPos] = name[12];
name[12]
超出了数组的范围。根据你到目前为止所展示的内容,在开始执行此任务之前,只有name
中存储了垃圾,所以你所做的就是重新组织数组中的垃圾。
答案 1 :(得分:0)
请将来:发布完整的可编辑示例。 一个简单的答案是你的数组可能超出范围,因为你没有提供完整的例子,很难确切知道。
这是一个有效的例子:
#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 ;
}
答案 2 :(得分:0)
简单地说,改变一下:
for(int i= startPos; i< startPos+10; i++)
对此:
for(int i= startPos; i<10; i++)
你应该没问题。
的说明:强>
在某些时候,当您使用旧循环时,此name[i-startPos] = name[i]
最终会超出数据索引范围并导致崩溃。
不要忘记清理/隐藏垃圾:
这样做会导致输出产生某种垃圾输出。如果您有一个 'ABCDEFGHIJ'
的字符数组,并选择3作为起始位置,则该数组将被安排为 'DEFGHIJHIJ'
。在你的输出中,你应该至少隐藏多余的字符,或者通过放置\0
的