Определить длину строки

danilzzzzzzz

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
int length(char*s)
{
    char*s=(char*)
        malloc(20);
    int i;
    for (i=0; s[i]!=0; i++)
        return i;
}
int main()
{
    char*s=(char*)
        malloc(20);
    int l;
    scanf ("%s", s);
    l=length(s);
    
    printf ("%i\n",l);
    system ("pause");
}
нужно было реализовать длину строки самому на си, но почему-то не работает, помогите пожалуйста.
10 ответов

danilzzzzzzz

В функции length переменная s объявлена 2 раза
int length(char*s)
{
char*s=(char*)malloc(20);
И не понятно зачем
почему-то не работает
Следует описывать, как не работает. Ошибки при трансляции (какие) твой случай, тут было несложно было догадаться, ошибка при запуске, работает - да результат не верен и т.д. ЗЫ. Теги кода!


danilzzzzzzz

нужно было реализовать длину строки самому на си
int mystrlen(const char * s) {
    const char * p;
    for ( p = s; *p; ++p )
        ;
    return p - s;
}
int mystrlen(const char * s) {
    return ( *s ) ? 1 + mystrlen(s + 1) : 0;
}
выбирай


danilzzzzzzz

мне нравится первый вариант, но пожалуйста сделайте полностью прогу, я не понимаю как она работает.


danilzzzzzzz

мне нравится первый вариант
Напрасно, юноша! Я понимаю, вкус у вас еще детский... Второй вариант намного интереснее и значительней и глубже и короче. И если вы его поймете, то вариант первый вам покажется таким мелководьем, на котором и ловить то нечего.


danilzzzzzzz

я не понимаю вообще что там происходит) помогите полностью прогу написать прошу, мне очень надо


danilzzzzzzz

реализовать длину строки самому
Мы то здесь при чем? Если представленный код ваш, то вам вполне должно быть достаточно здесь предложенного. Если же не ваш - есть тут раздел фриланс.


danilzzzzzzz

#include <stdio.h>
 
typedef char string_t[256];
#define get_string(s) ( scanf("%255[^\n]%*c", (s)) == 1 )
 
int mystrlen(const char * s) { return ( *s ) ? 1 + mystrlen(s + 1) : 0; }
 
int main(void) {
    string_t str;
    
    while ( printf("String: ") && get_string(str) )
        printf("\tlength of %d characters.\n", mystrlen(str));
    
    return 0;
}


danilzzzzzzz

Croessmah, на самом деле мне просто нравятся рекурсивные решения. В реальной программе выбирая между красотой и экономией минимум 4 байтов на каждой итерации, я бы тоже циклом сделал...


danilzzzzzzz

Ещё вариант
int mystrlen(const char * s) {
    int len = 0;
    while ( *s++ )
        ++len;
    return len;
}


danilzzzzzzz

спасибо большое)