2014-12-02 35 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