Короче говоря:
В последней итерации
for(int i = 0; i<=name.length; i++) {
i
будет равно name.length
, что является незаконным индексом, так как индексы массива равны нулю, основанный.
Ваш код должен читать
for(int i = 0; i < name.length; i++)
^
Это по сути то, что @Brandon уже сказал в комментариях.
main
должен возвращать код выхода / ошибки программы. В соглашении Unix 0
используется для указания отсутствия ошибки (значение ошибки «ложь»). А затем положительные значения используются для указания того, что произошла ошибка и какая это была ошибка.
Ваша логика имела бы смысл, если бы возвращаемое значение main
было интерпретировано как логическое значение, но это не так. Возврат из первоначального вызова к main
подобен вызову функции exit
: она сообщает о состоянии завершения системе, в которой вы работаете.
Стандарт C определяет 3 переносимых состояния выхода:
0
, указывающих на успех EXIT_SUCCESS
, также указывающих на успех EXIT_FAILURE
, указывающих fail (последние два являются макросами, определенными в <stdlib.h>
.)
В Unix допускается любое 8-битное значение (0 .. 255). Все ненулевые значения интерпретируются как коды ошибок. Не существует универсального соглашения о том, что означает любое число, просто то, что 0
представляет успех, а все остальное - своего рода провал.
Что касается того, кто может использовать возвращаемое значение: В Unix родительский процесс может использовать wait
или waitpid
, чтобы получить статус выхода прерванного потомка.
В стандартной библиотеке C функции, выполняющие действие, обычно не возвращают статус «истина / ложь». (Тесты, такие как islower
или isdigit
, но у них нет других эффектов.) Например, remove
(который удаляет файл) возвращает 0
в случае успеха и -1
в случае ошибки. Это также общий шаблон с системными вызовами Unix. Например, open
возвращает дескриптор файла (неотрицательное целое число) при успехе и -1
при ошибке.
Существует разница между тем, что язык C считает true
(не ноль) или false
(ноль), и тем, какие значения (ы) использует операционная система указывают на нормальное завершение программы.
Чтобы быть строго правильными, программы на С должны завершиться с кодом EXIT_SUCCESS
для нормального завершения программы или EXIT_FAILURE
для аварийного завершения. EXIT_SUCCESS
будет отображаться в любом коде, используемом базовой платформой для указания успеха, который может быть или не быть 0
.
Это действительно вопрос, который вы задаете программе, когда она заканчивается.
Случай 1:
Вы потерпели неудачу?
blockquote>Случай 2:
Вы прошли?
blockquote>В первом случае «хорошая программа» вернет false (он же ноль)
Во втором случае «хорошая программа» вернет true (он же не ноль).
Консенсус заключается в использовании варианта 1, т. Е. «Вы потерпели неудачу?». Поэтому безотказная программа возвращает ноль, чтобы сказать «Я не ошибся».
Преимущество этого подхода заключается в том, что ненулевые значения могут использоваться для выражения различных видов отказов, в то время как ноль всегда означает «нет отказов»
.