Код вылетает. Попытка удалить символы из массива символов 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

Я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить эту аварию.

Спасибо

-2

Решение

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

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

name[12] находится за пределами массива. Исходя из того, что вы показали до сих пор, ничего, кроме мусора, хранящегося в name в любом случае, прежде чем вы начнете выполнять это назначение, все, что вы делаете, это реорганизация мусора в массиве.

1

Другие решения

Пожалуйста, в будущем: опубликуйте полный пример.
Ответ прост: ваш массив может быть вне пределов, так как вы не предоставите полный пример, его трудно точно знать.

Вот рабочий пример:

#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«s

0
По вопросам рекламы [email protected]