Я в основном пытаюсь сохранить все после определенного индекса в массиве.
Например, я хочу сохранить имя, которое объявлено как 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
Я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить эту аварию.
Спасибо
предполагать i
равен 3. В последней итерации цикла, i
теперь равно 12, поэтому подставляя 12 в i
, ваша последняя строка читает
name[12-startPos] = name[12];
name[12]
находится за пределами массива. Исходя из того, что вы показали до сих пор, ничего, кроме мусора, хранящегося в name
в любом случае, прежде чем вы начнете выполнять это назначение, все, что вы делаете, это реорганизация мусора в массиве.
Пожалуйста, в будущем: опубликуйте полный пример.
Ответ прост: ваш массив может быть вне пределов, так как вы не предоставите полный пример, его трудно точно знать.
Вот рабочий пример:
#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 ;
}
Проще говоря, измените это:
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