代码崩溃。试图从char数组C中删除字符

时间:2014-12-02 20:44:55

标签: c++ arrays truncation strncpy

我基本上试图将所有内容存储在数组中的某个索引之后。

例如,我想存储一个声明为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

如果有人能帮助我解决此次崩溃,我将非常感激。

由于

3 个答案:

答案 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

来删除