2016-09-16 79 views
-2

我正在嘗試編寫一個函數,在C++數組中刪除一個元素,即將每個元素都從左側開始,從索引處開始。將C++數組中的每個元素移動到左邊

代碼

#include <iostream> 

using namespace std; 

const int MAX_SIZE = 50; 

void fill_array(char array[], int &current_size, const int max_size); 

void print_array(const char array[], const int current_size); 

int delete_index(char array[], int &current_size, int index); 

int main() { 

    char array[MAX_SIZE] = {' '}; 
    int current_size = 0; 
    fill_array(array, current_size, MAX_SIZE); 
    int index = 4; 
    delete_index(array, current_size, index); 
    cout << "After deleting element at index " << index << " the array is: "; 
    print_array(array, current_size); 

    return 0; 
} 

int delete_index(char array[], int &current_size, int index) { 
    // Check input 
    if (index > current_size) { 
     cout << "Index must be between 0 and " << current_size - 1 << endl; 
     return -1; 
    } 
    for (int i = index; i < current_size; i++) { 
     cout << "array[" << index << "] = " << index << endl; 
     array[index] = array[index + 1]; 
    } 
    current_size--; 
    cout << current_size << endl; 
    return 0; 
} 

但是,輸出輸入「thisisnotworking」當我和指標4:

Please input characters for the array (max of 50) or enter '*' to quit: 
onetwothree* 
array[4] = 4 
array[4] = 4 
array[4] = 4 
array[4] = 4 
array[4] = 4 
array[4] = 4 
array[4] = 4 
10 
After deleting element at index 4 the array is: onetoothre 

我不明白它是不是增加了指數在對循環。

我在這裏和其他地方讀過類似的問題,但仍然無法解決問題。任何想法爲什麼這是?

注:我只想使用數組(而不是向量等)。

+3

解決此類問題的正確工具是您的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

不!假設尺寸是10;所以array [9] = array [9 + 1] = array [10]:array [10]不是數組的元素。所以你正在分配垃圾值。要解決這個問題,你應該考慮到邊界問題。大小 - 只是循環打印的技巧。但真正的大小是一個數組常量。 10是10 – Raindrop7

+0

感謝您的回答,我會看看您通過的資源。我沒有包括其餘的功能,因爲它們是不言自明的,我不認爲它們是相關的。 – punddalinni

回答

1
for (int i = index; i < current_size; i++) { 
    cout << "array[" << index << "] = " << index << endl; 
    array[index] = array[index + 1]; 
    } 

你的循環計數器i。裏面你的循環,你應該使用i代替index

更正:

for (int i = index; i < current_size; i++) { 
    cout << "array[" << i << "] = " << array[i] << endl; 
    array[i] = array[i + 1]; 
    } 
0

因爲你使用array[index] = array[index + 1],而你需要array[i] = array[i + 1]

它在這裏是相同的:cout << "array[" << i << "] = " << i << endl;

+0

上面一行:'cout <<「array [」<< index <<「] =」<< index << endl;'應該使用'i'而不是'index'。 –

+0

@ C.H。是的,會添加這個。 – KKastaneda

0

使用指針來動態的改變大小:

#include <iostream> 
using std::cout; 
using std::cin; 
using std::endl; 

int* ClearElement(int array[], int index, const int& SizeOrig, int& NewSize) 
{ 
    array[index] = -1; 
    NewSize = SizeOrig; 
    NewSize--; 

    int* ptrArray = new int[NewSize]; 
    if(!ptrArray) 
     throw "No more memory!"; 

    for(int i(0), j(0); i < SizeOrig; i++) 
    { 
     if(-1 != array[i]) 
     { 
      ptrArray[j] = array[i]; 
      j++; 
     } 
    } 
    return ptrArray; 
} 


int main() 
{ 

    int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    int SizeOrig = (sizeof(array)/sizeof(int)); 
    int NewSize = SizeOrig; 

    int index; 

    try{ 
      cout << "element index to clear: "; 
      cin >> index; 
      cout << endl; 

      if(index < 0 || index > NewSize) 
       throw "out of boundary index!"; 

      int* ptrArray = ClearElement(array, index, SizeOrig, NewSize); 

      for(int i(0); i < NewSize; i++) 
       cout << ptrArray[i] << ", "; 

      delete[] ptrArray; 
     } 
    catch(char* cp) 
    { 
     cout << cp << endl; 
     exit(1); 
    } 
    catch(...) 
    { 
     cout << "sorry an error has happened!"; 
     exit(1); 
    } 


    cout << endl << endl << endl; 
    return 0; 
} 
0

您也可以使用std ::複製從算法

int max = 10; 
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
int index = 4; 
std::copy(array+index+1, array+max, array+index); 
相關問題