не только длина от 1, но если вы дадите ему пустую строку в качестве аргумента, где вы хотите его return 0, вы можете столкнуться с нарушением доступа (хотя большую часть времени вы не будете, потому что нулевые байты довольно распространены в неинициализированной памяти) или случайное число (в основном это вернет число ненулевых байтов, которые . хранится 1 байты позади с-струнной пустой строковой константой
длина отстоит от 1, потому что вы используете префикс инкрементного оператор, который вычисляется как первое, что в строке:
while(*(++s)!='\0')
В частности, если вы посмотрите на то, что вы там делаете, долговременно руку, он будет читать так:
char *s = "this";
int i = 0;
while (1) {
s = s + 1;
if (*s == '\0') break;
i++;
}
printf("%d", i);
...
Вы видите проблему? ++s
увеличивает указатель на первое место. Таким образом, вы пропускаете первую букву строки.
Во всяком случае, то, что вы, вероятно, хотите что-то вроде этого:
int len(const char *s) {
int clen = 0;
while (*s++ != '\0') clen++;
return clen;
}
Конечно, можно было бы спросить, почему вы повторно изобретать колесо, когда у вас есть strlen()
и strnlen()
в стандартной библиотеке C. Возможно, это просто упражнение?
Является ли длина 3 или 1? Не могли бы вы перефразировать вопрос. Немного «непрозрачный» – junix
длина равна 3 при вызове функции len и передаче «this» в качестве аргумента, где, как если бы вы передавали пресс-форму «hi», длина равна 1. – 2013-02-14 06:09:02
Спасибо за очистку. Я понял это тем временем и опубликовал объяснение. – junix