Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Clop
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 6
1

Написать функцию на Си, которая бы определяла длину вводимой строки

25.03.2014, 22:56. Просмотров 1762. Ответов 28
Метки нет (Все метки)

Всем привет. Хотелось бы получить помощь, человеческую с объяснением. Суть вопроса - написать функцию на Си, которая бы определяла длину вводимой строки. Поискал, почитал, но так и не понял, может кто-нибудь помочь и написать такую функцию с объяснениями? Спасибо заранее.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2014, 22:56
Ответы с готовыми решениями:

Написать функцию, вычисляющую длину строки, передаваемой в качестве аргумента
задание: напишите функцию, которая вычисляет длину строки, передаваемой в...

Написать функцию, которая исключает из строки s1 любой из символов строки s2
Напишите функцию, которая исключает из строки s1 любой из символов строки s2

Написать программу, которая определяет длину строки - strlen (число символов без завершающего нуль-символа)
Написать программу с помощью символьных строк и функции обработки строк. ...

Написать программу, которая вычисляет среднее арифметическое вводимой с клавиатуры последовательности целых
Написать программу, которая вычисляет среднее арифметическое вводимой с...

Написать функцию, которая ищет в строке s1 любой символ из строки s2
Написать функцию, которая ищет в строке s1 любой символ из строки s2 (char...

28
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
25.03.2014, 23:09 2
C
1
2
3
4
5
6
7
8
9
int length(char* str)
{
    int len = 0;
    while( *str != '\0' ) {
        ++str;
        ++len;
    }
    return len;
}
Я попытался составить самый понятный вариант, хотя он, конечно, жутко неидиоматичен и неоптимален.
3
Clop
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 6
25.03.2014, 23:57  [ТС] 3
Спасибо за ответ.
А что такое '\0'
И где ввод с клавиатуры символов?
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
26.03.2014, 00:11 4
Цитата Сообщение от Clop Посмотреть сообщение
Спасибо за ответ.
Тут надо нажимать такую синюю кнопку с надписью "Спасибо".

А что такое '\0'
Признак конца строки.

И где ввод с клавиатуры символов?
Вы просили функцию. Я написал функцию. И тут вдруг странные заявления, типа я Вам еще что-то должен.
1
Clop
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 6
26.03.2014, 00:39  [ТС] 5
Нет вы не подумайте, что я что-то требую от вас. Это союз, который соединяет два вопроса "А что такое '\0'" и "где ввод с клавиатуры символов?"
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
26.03.2014, 00:52 6
А откуда вообще взялся вопрос "где ввод с клавиатуры символов?"? Видимо, Вы имели в виду, что Вам нужна готовая программа с вводом символов и т.д. Однако слово "функция" имеет совершенно иной смысл в программировании. Честно говоря, мне просто неинтересно помогать человеку с таким уровнем знаний.
0
IrineK
Заблокирован
26.03.2014, 01:46 7
Опять рекурсия:
C
1
2
3
long int StrLength (char *str)
{   return (*str != 0) ? 1 + StrLength (str + 1) : 0;
}
Цитата Сообщение от Clop Посмотреть сообщение
где ввод с клавиатуры символов?
Пока нет. Но можно и так.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
long int StrLength (char *str)
{   return (*str != 0) ? 1 + StrLength (str + 1) : 0;
}
 
int main()
{   char *str = "Noobs are dull, but any of us has been either the first or the second";
    puts (str);
    printf("Length %ld", StrLength (str));
 
    getchar();
    return 0;
}
0
alkagolik
Заблокирован
26.03.2014, 03:42 8
IrineK,
C
1
2
3
int len_recursive1(char * s) {
    return *s ? 1 + len_recursive1(s + 1) : 0;
}
Код
len_recursive1("asdf")
(1 + (len_recursive1("sdf")))
(1 + (1 + (len_recursive1("df"))))
(1 + (1 + (1 + (len_recursive1("f")))))
(1 + (1 + (1 + (1 + (len_recursive1(""))))))
(1 + (1 + (1 + (1 + (0)))))
(1 + (1 + (1 + (1))))
(1 + (1 + (2)))
(1 + (3))
4
C
1
2
3
int len_recursive2(char * s, int res) {
    return *s ? len_recursive2(s + 1, res + 1) : res;
}
Код
len_recursive2("asdf", 0)
(len_recursive2("sdf", 1))
((len_recursive2("df", 2)))
(((len_recursive2("f", 3))))
((((len_recursive2("", 4)))))
4
1
IrineK
Заблокирован
26.03.2014, 03:49 9
И теперь вопрос: кто будет юзать эту функцию.
Если сам - ищи компактных решений.
Если еще кто-то - удобных.
По возможности - ищи копромисс ).
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
26.03.2014, 11:32 10
Вот, если кому интересно, максимально идиоматичный и оптимизированный код, какой я смог написать:

C
1
2
3
4
5
6
7
size_t strlen(const char* str)
{
    register char* i;
    for( i = str; *i; ++i )
        ;
    return i - str;
}
0
easybudda
26.03.2014, 15:53
  #11

Не по теме:

IrineK, а тут немного не в том дело. Хвостовая рекурсия выгодно отличается от обычной тем, что переполнения стека не вызовет (фактически компилятор её в цикл завернёт). Для определения длины строки в 3 +/- полтора символа, разумеется, не важно, но как факт интересно по-своему...

0
IrineK
Заблокирован
26.03.2014, 16:05 12
easybudda,
спасибо - учту )
0
korvin_
26.03.2014, 17:08
  #13

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
Хвостовая рекурсия выгодно отличается от обычной тем, что переполнения стека не вызовет (фактически компилятор её в цикл завернёт
Это если компилятор умеет; стандарт не обязывает.

0
easybudda
Модератор
Эксперт CЭксперт С++
10154 / 6059 / 1524
Регистрация: 25.07.2009
Сообщений: 11,484
26.03.2014, 17:10 14

Не по теме:

Цитата Сообщение от korvin_ Посмотреть сообщение
стандарт не обязывает
Ну это - да. Обладатели TurboC++ 3.0 от Borland нервно курят :D


Кстати, на форуме strlen уже как только ни писали. Вот порылся и нашёл свою типа супербыструю на длинных строках: http://www.cyberforum.ru/post4598676.html
1
alkagolik
Заблокирован
26.03.2014, 19:59 15
длина с подвыподвертом.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
unsigned str_length (const char * const str)
{
    short x = 1;
    char * ptr = (char*) &x;
    unsigned res = 0;
 
    if (ptr[0] == 1)
        res = strchr((char*)str, 0) - (char*)str;
    else
        res = (char*)str - strchr((char*)str, 0);
 
    return res;
}
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
26.03.2014, 21:05 16
Ну раз уж пошел такой баттл, осталось сделать фаталити: своя реализация строк с указанием длины в первом символе. Кстати, я как раз делаю что-то подобное. У меня в программе будет единый пул строк, располагающихся друг за другом. Соответственно, проходить по строкам будет проще всего, зная их длину. Нужда в нулевом символе при этом отпадает. На удобстве это не скажется, потому что строки я только добавляю в пул и проверяю их идентичность по длине и хэшу. Больше они мне ни для чего не нужны.
0
Clop
0 / 0 / 0
Регистрация: 25.03.2014
Сообщений: 6
26.03.2014, 22:28  [ТС] 17
Всем большое спасибо) Не ожидал что такая темка вызовет столько вариантов решения проблемы )
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
26.03.2014, 22:50 18
Это особенность языка С: даже самую простую задачу можно при желании бесконечно вылизывать до идеала.
0
alkagolik
Заблокирован
27.03.2014, 00:00 19
Цитата Сообщение от Vtulhu Посмотреть сообщение
Ну раз уж пошел такой баттл, осталось сделать фаталити: своя реализация строк с указанием длины в первом символе.
Не мало байта для длины?
C
1
2
3
4
5
union string_t
{
    char * s;
    unsigned len;
};
0
Vtulhu
423 / 377 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
27.03.2014, 00:10 20
Цитата Сообщение от alkagolik Посмотреть сообщение
Не мало байта для длины?
Для моих целей хватит с избытком. Вот где бы найти алгоритм хэширования, который бы для пятибитных значений давал восьмибитный хэш...
0
27.03.2014, 00:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2014, 00:10

Написать функцию, которая ищет символ одной строки, отсутствующий в другой
Написать функцию, которая ищет символ одной строки, отсутствующий в другой...

Написать функцию, которая бы удаляла из строки s1 все символы встречающиеся в строке s2
Решая задачу 2.4 из книги &quot;Язык программирования СИ&quot;, в которой нужно написать...

Написать функцию, которая возвращает массив символов с элемента N по M из заданной строки
Стоит задача написать функцию, которая возвращает массив символов с элемента N...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru