Проблема в том, что если вы закомментируете оператор printf()
в функции length()
, оператор return
становится частью тела цикла, и самая первая итерация возвращается из вызова, и вы получаете the-then значение i
, которое является просто значением записи для цикла, 0
.
for (i = 0; s[i] != '\0'; ++i)
//printf("%d ", i); //<-- here
return i; // without brace-enfoced scope, this is the loop body.
совпадает с
for (i = 0; s[i] != '\0'; ++i)
return i;
ЧтоВам необходим цикл, чтобы завершить выполнение, выполнить критерии выхода, а затем выполнить оператор return
с самым последним значением i
.
Таким образом, чтобы избежать проблемы, вы можете принудительно выполнить пустое выполнение цикла, например,
for (i = 0; s[i] != '\0'; ++i) ; // notice the ; here, ends the scope.
return i;
или, что еще лучше (для читателей)
for (int i = 0; i < 10; i++)
{/*nothing here*/} //indicates empty loop body
return i;
Примечание. В качестве альтернативного способа повышения читабельности вместо конструкции for
можно также использовать цикл while
, который выглядит как
while (s[i] != '\0')
{
i++; //increment statement is explicit.
}