2014-12-02 10 views
-2

Я в основном пытаюсь сохранить все после определенного индекса в массиве.Сбой кода. Попытка удалить символы из массива char C

Например, я хочу сохранить имя, которое объявлено как char name[10]. Если пользователь вводит в словах 15 символов, он будет игнорировать первые пять символов и сохранить остальное в массиве символов, однако моя программа выйдет из строя.

Это мой код

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

Если 'name' объявлено как' name [10] 'и' startPos> 0', то 'i' будет больше, чем 10, и поэтому 'name [i]' будет работать за пределами выделенного пространства. Код, который вы опубликовали, не очень ясен в этом контексте, поскольку вы описываете половину его словами, а не кодом. – Misch

+2

Как вы сохраняете 15 символов ввода пользователя в переменной 'char name [10]'? Когда вы знаете ответ на этот вопрос, вы поймете, в чем проблема. К сожалению, эта часть вашей программы не в вашем вопросе, поэтому я не могу ответить на этот вопрос. Тем не менее, я могу сказать вам, что невозможно хранить 15 символов в массиве из 10 'char', не вызывая «неопределенного поведения», что часто приводит к сбоям позже. –

+0

Код, который вы предоставили, похоже, не относится к заданному вами вопросу. 'Если пользователь вводит в себя 15 символов ...'; Я не вижу, чтобы ваша программа запрашивала имя пользователя в любом месте. Пожалуйста, перефразируйте свой вопрос и/или включите [MCVE] (http://stackoverflow.com/help/mcve). – Julian

ответ

1

Пусть i равно 3. В последней итерации цикла, i теперь равна 12, так что подставляя 12 в течение i, ваша последняя строка читает

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