0 / 0 / 1
Регистрация: 26.06.2015
Сообщений: 16
1

Заменить функцию strlen на свою

11.09.2015, 12:13. Показов 11902. Ответов 22
Метки нет (Все метки)

подскажите, как написать свою собственную функцию, эквивалентную функции strlen. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
int main()
{
char **T;
int i, n, c, b, d;
printf("\nProgramma dlya nahozhdeniya samoi dlinnoi stroki v tekste \n");
printf("Zadayte kolichestvo strok \n");
scanf("%d", &n);
fflush(stdin);
T=new char *[n];
printf("Vvedite text\n");
 
for ( i=0; i<n; i++)
{ T[i]=new char [100]; gets(T[i]); }
int max=0;
printf("Samaya dlinnaya stroka:\n");
for (i=0; i<n; i++){b=strlen(T[i]);
    if (b>max) { max=b; c=i;}
}
d=strlen(T[c]);
for (i=0;i<d;i++)
printf("%c",T[c][i]);
}
Теперь нужно функцию strlen заменить на свою собственную.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2015, 12:13
Ответы с готовыми решениями:

Как заменить функцию fgets на strlen и strcpy?
while (fgets(s1, sz_line, fp)) //будет прочитано 120 символов { // считаем длину текущей...

Необходимо заменить функцию ДАТАМЕС на свою аналогичную функцию
Всем Добрый Вечер! Если кто то знает,прошу подсказать.. Необходимо заменить функцию ДАТАМЕС на...

Необходимо заменить функцию ДАТАМЕС на свою аналогичную функцию
Всем Здравствуйте.. Уже спрашивала этот вопрос, но прога не прокатила.. Необходимо заменить...

Не видит функцию strlen
Когда запуская программу через терминал, выводится сообщение, что strlen was not declared in this...

22
3982 / 3252 / 909
Регистрация: 25.03.2012
Сообщений: 12,089
Записей в блоге: 1
11.09.2015, 12:20 2
C++
1
2
3
4
5
6
7
8
9
size_t
strlen(const char *str)
{
        const char *s;
 
        for (s = str; *s; ++s)
                ;
        return (s - str);
}
1
Заблокирован
11.09.2015, 12:22 3
C
1
2
3
4
5
6
int mystrlen(char* s)
{
    int n;
    for(n=0; s[n]; n++);
    return n;
}
1
0 / 0 / 1
Регистрация: 26.06.2015
Сообщений: 16
11.09.2015, 12:36  [ТС] 4
спасибо, а с циклом while как такое провернуть можно?
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
11.09.2015, 12:39 5
lamp,
C++
1
2
3
4
int mystrlen(const char* str)
{
    return *str ? mystrlen(++str) + 1 : 0;
}
0
Заблокирован
11.09.2015, 12:40 6
C
1
2
3
4
5
6
int mystrlen(char* s)
{
    int n=0;
    while(s[n++]);
    return n-1;
}
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
11.09.2015, 14:14 7
Вот такая реализация есть в glibc:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
size_t strlen (const char *str)
{
  const char *char_ptr;
  const unsigned long int *longword_ptr;
  unsigned long int longword, himagic, lomagic;
 
  /* Handle the first few characters by reading one character at a time.
     Do this until CHAR_PTR is aligned on a longword boundary.  */
  for (char_ptr = str; ((unsigned long int) char_ptr
            & (sizeof (longword) - 1)) != 0;
       ++char_ptr)
    if (*char_ptr == '\0')
      return char_ptr - str;
 
  /* All these elucidatory comments refer to 4-byte longwords,
     but the theory applies equally well to 8-byte longwords.  */
 
  longword_ptr = (unsigned long int *) char_ptr;
 
  /* Bits 31, 24, 16, and 8 of this number are zero.  Call these bits
     the "holes."  Note that there is a hole just to the left of
     each byte, with an extra at the end:
 
     bits:  01111110 11111110 11111110 11111111
     bytes: AAAAAAAA BBBBBBBB CCCCCCCC DDDDDDDD
 
     The 1-bits make sure that carries propagate to the next 0-bit.
     The 0-bits provide holes for carries to fall into.  */
  himagic = 0x80808080L;
  lomagic = 0x01010101L;
  if (sizeof (longword) > 4)
    {
      /* 64-bit version of the magic.  */
      /* Do the shift in two steps to avoid a warning if long has 32 bits.  */
      himagic = ((himagic << 16) << 16) | himagic;
      lomagic = ((lomagic << 16) << 16) | lomagic;
    }
  if (sizeof (longword) > 8)
    abort ();
 
  /* Instead of the traditional loop which tests each character,
     we will test a longword at a time.  The tricky part is testing
     if *any of the four* bytes in the longword in question are zero.  */
  for (;;)
    {
      longword = *longword_ptr++;
 
      if (((longword - lomagic) & ~longword & himagic) != 0)
    {
      /* Which of the bytes was the zero?  If none of them were, it was
         a misfire; continue the search.  */
 
      const char *cp = (const char *) (longword_ptr - 1);
 
      if (cp[0] == 0)
        return cp - str;
      if (cp[1] == 0)
        return cp - str + 1;
      if (cp[2] == 0)
        return cp - str + 2;
      if (cp[3] == 0)
        return cp - str + 3;
      if (sizeof (longword) > 4)
        {
          if (cp[4] == 0)
        return cp - str + 4;
          if (cp[5] == 0)
        return cp - str + 5;
          if (cp[6] == 0)
        return cp - str + 6;
          if (cp[7] == 0)
        return cp - str + 7;
        }
    }
    }
}
Добавлено через 1 минуту
P.S. авторское форматирование сохранено.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
11.09.2015, 14:18 8
HighPredator, можете пожалуйста описать преимущества данной реализации?
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
11.09.2015, 14:20 9
Там собственно в комментах написано. Пока указатель не будет выровнен по границе longword-а просмотр идет побайтно, далее по 4 байта за итерацию. Быстрее короче.
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
11.09.2015, 14:21 10
Цитата Сообщение от HighPredator Посмотреть сообщение
if (((longword - lomagic) & ~longword & himagic) != 0)
Цитата Сообщение от HighPredator Посмотреть сообщение
himagic = ((himagic << 16) << 16) | himagic;
По каким книжкам можно обучиться такому стилю программирования?
Имеет ли смысл пихать битовые операции в каждую дырку?
0
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
11.09.2015, 14:23 11
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Имеет ли смысл пихать битовые операции в каждую дырку?
битовые операции выполняются очень быстро. Частенько xor используют вместо присваивания нуля правда сейчас и компиляторы так делать научились при оптимизации
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
11.09.2015, 14:25 12
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
По каким книжкам можно обучиться такому стилю программирования?
Не знаю, я таких не читал.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Имеет ли смысл пихать битовые операции в каждую дырку?
Только если стоит такая задача (т.е. что-то соптимизировать надо).
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
11.09.2015, 14:27 13
Croessmah, т.е. пиша (не могу подобрать форму деепричастия наст. времени) программы на современных компиляторах, можно забыть про все эти низкоуровневые вещи типа работы с битами?
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
11.09.2015, 14:28 14
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
не могу подобрать форму деепричастия наст. времени
Пися
0
803 / 530 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
11.09.2015, 14:29 15
HighPredator, castaway, Croessmah, а как и где можно обучиться таким алгоритмическим трюкам?
0
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
11.09.2015, 14:29 16
castaway,
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
можно забыть про все эти низкоуровневые вещи типа работы с битами?
конечно нет. Компилятор поможет, но думать за Вас он не сможет
0
6044 / 2159 / 753
Регистрация: 10.12.2010
Сообщений: 6,007
Записей в блоге: 3
11.09.2015, 14:30 17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
т.е. пиша программы на современных компиляторах, можно забыть про все эти низкоуровневые вещи типа работы с битами?
Да. Если только вас устраивает быстродействие соптимизированного по скорости кода. Если нет, тогда биты в помощь.
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
11.09.2015, 14:35 18
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
HighPredator, castaway, Croessmah, а как и где можно обучиться таким алгоритмическим трюкам?
Даже хз... Почитай про принципы оптимизации на низком уровне, всё остальное - дело логики.
0
16478 / 8975 / 2201
Регистрация: 30.01.2014
Сообщений: 15,590
11.09.2015, 17:05 19
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
где можно обучиться таким алгоритмическим трюкам?
Всему не научит, но но есть такая вот книга. Кое-что можно почерпнуть оттуда на первых парах.
2
Don't worry, be happy
17781 / 10545 / 2035
Регистрация: 27.09.2012
Сообщений: 26,514
Записей в блоге: 1
11.09.2015, 17:09 20
DrOffset, кстати, хорошая книга
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2015, 17:09
Помогаю со студенческими работами здесь

Почему в коде записано strlen()+1 вместо strlen()
здравствуйте. объясните пожалуйста. почему для выделения места на основе размера уже существующей...

Пишу функцию, подсчитывающую число символов (как strlen), но не получается
Проблема в том,что компилятор ругается на несоответствие типов в строке 8(условие в while).Пробовал...

Подскажите функцию, которая возвращает длину строки (string), strlen не подходит.
Подскажите функцию, которая возвращает длину строки (string), strlen не подходит!!!!!!

Передача массива символов в функцию strlen после создания его функцией sprintf
Если вводится 1 символ, выводится &quot;8&quot;, 2 символа - &quot;9&quot;. И так далее. Почему? Это нормально?...

Преобразовать функцию strcmp в СВОЮ функцию
Необходимо редактировать код программы(получающей на входе строку и выводящую одинаковые слова и...

Преобразовать функцию strcmp в СВОЮ функцию
Нужно заменить функцию strcmp на свою. я создала свою, но код не коректний и выбивает ошибки. ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru