Ваша строка не завершена нулевым символом, поэтому, когда она печатается, она продолжает печатать символы, предшествующие 8, которые вы выделили, и ищет их, но до этого времени заканчивается пространство стека. Вы также пишете на один символ больше, чем вы выделили, и ваши условия должны быть «объединены» с &&
- a ,
игнорирует результат первого выражения. Вы также должны избегать использования строковой переменной в качестве форматирования строк до printf
.
Вот ваш код fixed:
char array1[10] = "123456789";
char array2[9];
int i, j;
for(i = 1, j = 0 ; i < 10 && j < 9; i++, j++){
array2[j] = array1[i];
}
printf("%s\n", array2);
Вы также можете упростить цикл, используя единый индекс переменной i
и индексации array2
с i+
. Вы также можете полностью удалить цикл, используя strncpy
, но имейте в виду, что если n
меньше длины строки + 1, он не добавит нулевой ограничитель.
Вы можете инициализировать для петель, как это? Я бы просто сделал для (i = 0; i <8; i ++) {array2 [j] = array1 [j + 1]; } – Shaded
Ummm, первый индекс массива C равен 0. Последний индекс - размер-1. Таким образом, вы переполняете массив2, когда вы назначаете 'array2 [8]'. Кроме того, ваше состояние с оператором запятой неверно, помните, что оператор запятой выбрасывает первое значение. Вместо этого вы хотите '&&'. – derobert