2014-12-02 32 views
-2

我基本上试图在数组中的某个索引之后存储所有内容。代码崩溃。试图从字符数组中删除字符C

例如,我想存储一个声明为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,我想程序只是存储一切从第三的位置,所以最终的结果是Stevesonse

我真的感谢它,如果有人可以帮助我解决这个崩溃。

感谢

+0

来删除如果name被声明为name和startPos> 0, 10,所以'name [i]'将访问超出分配的空间。你发布的代码在这方面不是很清楚,因为你用文字描述了一半,而不是代码。 – Misch 2014-12-02 20:48:52

+2

如何将用户输入的15个字符存储到'char name [10]'变量中?当你知道这个问题的答案时,你就会明白问题所在。不幸的是,你的程序的这部分不在你的问题中,所以我不能回答这个问题。但是,我可以告诉你,不可能将15个字符存储到10个“char”数组中,而不会导致“未定义的行为”,这往往会导致以后崩溃。 – 2014-12-02 20:53:20

+0

您提供的代码似乎与您所问的问题无关。 '如果用户输入了15个字符......';我没有看到你的程序在任何地方要求用户的名字。请更改您的问题和/或包含[MCVE](http://stackoverflow.com/help/mcve)。 – Julian 2014-12-02 21:13:52

回答

1

假设i等于3.在循环的最后一次迭代,i现在等于12,在i所以替换12,你的最后一行显示

name[12-startPos] = name[12]; 

name[12]超出数组的范围。根据你到目前为止显示的内容,在开始完成这项任务之前,除了垃圾之外,没有任何东西存储在name之前,所以你所做的只是重新组织数组中的垃圾。

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 ; 
} 
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