Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 138, средняя оценка - 4.62
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. - C++

06.06.2009, 17:18. Просмотров 18167. Ответов 29
Метки нет (Все метки)

Напишите свои аналоги функций strlen(),strcpy(),strcmp() и сравните с библиотечными.
Наивно написал эти функции:
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
int strlen(char* c_str)
{
    int count=0;
    while(*c_str++) ++count;
    return count;
}
 
/************************************************/
 
void strcpy(char* c_str1,char* c_str2)
{
    while(*c_str2++=*c_str1++);
}
 
/************************************************/
 
int strcmp(char* c_str1,char* c_str2)
{
    if (strlen(c_str1)!=strlen(c_str2)) return 0;
    int count=strlen(c_str1)+1;
    while(*c_str1++==*c_str2++) --count;
    if (count) return 0;
    return 1;
}
Смотрю в библиотеке и вижу это(в файле string.h):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
/* Copy SRC to DEST.  */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
     __THROW __nonnull ((1, 2));
 
/************************************************/
 
extern int strcmp (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
 
/************************************************/
 
extern size_t strlen (__const char *__s)
     __THROW __attribute_pure__ __nonnull ((1));
Где сами алгоритмы функций?Что-то я запутался в этих файлах и не нашёл.Кто-нибудь может скопипастить/направить?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2009, 17:18     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Посмотрите здесь:
C++ Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки)
Реализовать собственные функции strcat, strcpy, strcmp, strlen C++
Как заменить функцию fgets на strlen и strcpy? C++
C++ Написать программу: работа с си строками, функции strlen, strcpy
Аналоги функций ord() и chr() C++
Есть в языке "С" аналоги функций Pos() и Delete()? C++
напишите в С++ программу-калькулятор арифметических функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2788 / 1374 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.06.2009, 17:28     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #2
самих функций вы не увидите... в заголовочный файлах описаны лишь прототипы...
сами функции хранятся в библиотеках
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 17:49  [ТС]     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #3
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
самих функций вы не увидите... в заголовочный файлах описаны лишь прототипы...
сами функции хранятся в библиотеках
я и спрашиваю,где конкретно в библиотеках
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
06.06.2009, 18:10     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #4
Цитата Сообщение от #pragma Посмотреть сообщение
я и спрашиваю,где конкретно в библиотеках
Нигде. У тебя они только в бинарном виде: т.е. в комплекте с компилятором у тебя идут бинарники и инклюды к ним. Разработчики исходники библиотек не поставляют

Добавлено через 1 минуту 19 секунд
Вот одна из реализаций strlen'а: http://www.openbsd.org/cgi-bin/cvswe...e=text%2Fplain
Она быстрее, чем твоя, потому как в цикле идёт только одна инкрементация, а у тебя две

Добавлено через 4 минуты 18 секунд
Вот ещё одна реализация, оптимизированная в первую очередь под длинные строки
http://tsunanet.net/~tsuna/strlen.c.html
Работа идёт long'ами (т.е. почти вся строка проматывается кусками размером с long (для 32-битных систем по 4 байта, для 64-битных - по 8). Ещё одна причина, почему этот код работает быстро - из-за того, что обращения в память по слову на некоторых арихитектурах работают лучше, чем обращения по байту из-за особенностей реализации кэша

Добавлено через 3 минуты 14 секунд
Кстати, по документации strcpy возвращает dst, а не void, как у тебя
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:11  [ТС]     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #5
Только сейчас дошло,что вся библиотека имеет закрытый код...Это правда так?? Очень печально.Насчёт инкремента спасибо,постараюсь запомнить.Правда этот вариант с char вроде потом переделали,
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
77
78
79
80
81
82
83
#include <sys/cdefs.h>
__FBSDID("$FreeBSD: src/lib/libc/string/strlen.c,v 1.6 2009/01/25 23:08:47 delphij Exp $");
 
#include <sys/limits.h>
#include <sys/types.h>
#include <string.h>
 
/*
 * Portable strlen() for 32-bit and 64-bit systems.
 *
 * Rationale: it is generally much more efficient to do word length
 * operations and avoid branches on modern computer systems, as
 * compared to byte-length operations with a lot of branches.
 *
 * The expression:
 *
 *  ((x - 0x01....01) & ~x & 0x80....80)
 *
 * would evaluate to a non-zero value iff any of the bytes in the
 * original word is zero.  However, we can further reduce ~1/3 of
 * time if we consider that strlen() usually operate on 7-bit ASCII
 * by employing the following expression, which allows false positive
 * when high bit of 1 and use the tail case to catch these case:
 *
 *  ((x - 0x01....01) & 0x80....80)
 *
 * This is more than 5.2 times as compared to the raw implementation
 * on Intel T7300 under EM64T mode for strings longer than word length.
 */
 
/* Magic numbers for the algorithm */
#if LONG_BIT == 32
static const unsigned long mask01 = 0x01010101;
static const unsigned long mask80 = 0x80808080;
#elif LONG_BIT == 64
static const unsigned long mask01 = 0x0101010101010101;
static const unsigned long mask80 = 0x8080808080808080;
#else
#error Unsupported word size
#endif
 
#define LONGPTR_MASK (sizeof(long) - 1)
 
/*
 * Helper macro to return string length if we caught the zero
 * byte.
 */
#define testbyte(x)             \
    do {                    \
        if (p[x] == '\0')       \
            return (p - str + x);   \
    } while (0)
 
size_t
strlen(const char *str)
{
    const char *p;
    const unsigned long *lp;
 
    /* Skip the first few bytes until we have an aligned p */
    for (p = str; (uintptr_t)p & LONGPTR_MASK; p++)
        if (*p == '\0')
        return (p - str);
 
    /* Scan the rest of the string using word sized operation */
    for (lp = (const unsigned long *)p; ; lp++)
        if ((*lp - mask01) & mask80) {
        p = (const char *)(lp);
        testbyte(0);
        testbyte(1);
        testbyte(2);
        testbyte(3);
#if (LONG_BIT >= 64)
        testbyte(4);
        testbyte(5);
        testbyte(6);
        testbyte(7);
#endif
        }
 
    /* NOTREACHED */
    return 0;
}
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
06.06.2009, 18:12     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #6
Для strcpy что-то не нашёл ничего интересного, но там тоже могут быть какие-то замуты по поводу широкого копирования
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:13  [ТС]     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #7
А открытые библиотеки есть ?
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
06.06.2009, 18:14     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #8
Цитата Сообщение от #pragma Посмотреть сообщение
Правда этот вариант с char вроде потом переделали
Возможно. В детали реализации я не вникал, но суть того, откуда возникла такая большая процедура и, главное, зачем - я так думаю, ты понял

Добавлено через 1 минуту 0 секунд
Цитата Сообщение от #pragma Посмотреть сообщение
А открытые библиотеки есть ?
Есть glibc
Только не зная, как они устроены, временами бывает, что без поллитры не разберёшь, что, где и как реализовано. Для intel'а там скорее всего на ассемблере эти вещи написаны
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
07.06.2009, 12:06     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #9
Что-то тут strcmp не то возвращает
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
07.06.2009, 12:27     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #10
Цитата Сообщение от Somebody Посмотреть сообщение
Что-то тут strcmp не то возвращает
Кстати да, возвращать должно 0, 1 или -1, т.е. результат сравнений "равно", "больше" или "меньше". А твой вариант умеет только "равно" и "не равно"
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.06.2009, 21:13  [ТС]     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #11
Да,я когда писал,подумал,что третьего не дано,или строки идентичны,или нет.
flexin777
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 5
10.04.2011, 15:23     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #12
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
int strlen(char*);
char* strcpy(char*,char*);
int strcmp(char* ,char* );
void main()
{
char *string="Hello!";
    int length=strlen(string);
    char *string_1="abcde";
    char *string_2="efgh";
    char string2_mas[40];
    strcpy(string2_mas,string_1);
    int compare=strcmp(string_1,string_2);
}
 
    int strlen(char* c_str)
{
    int count=0;
    while(*c_str++) ++count;
    return count;
}
 
 
 
char* strcpy(char* c_str1,char* c_str2)
{
    while(*c_str1++=*c_str2++);
    return c_str1;
}
 
 
 
int strcmp(char* c_str1,char* c_str2)
{
    if (strlen(c_str1)<strlen(c_str2)) return -1;
    if (strlen(c_str1)>strlen(c_str2)) return 1;
    if (strlen(c_str1)==strlen(c_str2))return 0;
}
По-моему,вот так будет правильнее
Evg
Эксперт CАвтор FAQ
17542 / 5780 / 370
Регистрация: 30.03.2009
Сообщений: 15,920
Записей в блоге: 26
10.04.2011, 15:28     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #13
flexin777, strcpy возвращает неправильное значение, а strcmp работает в принципе неправильно (такое ощущение, что ты даже не знаешь, что она делает)
flexin777
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 5
11.04.2011, 16:15     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #14
Не могли бы Вы исправить,как правильно должно быть?
Я только учусь и может допустил ошибку.
Evg,заранее спасибо за ответ!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 17:04     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Еще ссылки по теме:
Не применяя библиотечных функций, напишите код функции C++
C++ Напишите программы для вычисления значений математических функций
Напишите варианты библиотечных функций strncpy, strncat и strncmp C++
C++ Напишите алгоритм сортировки массива по возрастанию, без использования встроенных функций языка

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

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
11.04.2011, 17:04     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. #15
flexin777, ты сначала разберись, что эти функции должны делать. Тогда решение станет очевидным. Прочитай где-нибудь описание этих функций, какие у них формальные параметры и возвращаемые значения.
Yandex
Объявления
11.04.2011, 17:04     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Ответ Создать тему
Опции темы

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