Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

06.06.2009, 17:18. Просмотров 18948. Ответов 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));
Где сами алгоритмы функций?Что-то я запутался в этих файлах и не нашёл.Кто-нибудь может скопипастить/направить?
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2009, 17:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными. (C++):

Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat (дописать и исправить ошибки) - C++
вот задание: Написать собственные аналоги функций strlen, strcmp, strchr, strcpy, strcat из стандартной библиотеки cstring (string.h). ...

Реализовать собственные функции strcat, strcpy, strcmp, strlen - C++
Добрый день. Помогите с задачей. Необходимо реализовать собственные функции strcat, strcpy, strcmp, strlen. Для strlen реализовал, а...

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

Написать программу: работа с си строками, функции strlen, strcpy - C++
С помощью данного алгоритма нужно вставить слово в конец и начало строки. С помощью strlen() узнать длину строки и длину слова, после...

Аналоги функций ord() и chr() - C++
Господа, программисты Си! Подскажите пожалуйста, есть ли (и какие) сишные аналоги функций ord() и chr() из паскаля? Большое спасибо.

Strlen, strcpy, strcmp - Visual C++
Сдрасти! помогите плиз нупке! int m_strlen(const char* a) { } void m_strcpy(char* a1, const char* a2)

29
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
06.06.2009, 17:28 #2
самих функций вы не увидите... в заголовочный файлах описаны лишь прототипы...
сами функции хранятся в библиотеках
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 17:49  [ТС] #3
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
самих функций вы не увидите... в заголовочный файлах описаны лишь прототипы...
сами функции хранятся в библиотеках
я и спрашиваю,где конкретно в библиотеках
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,629
Записей в блоге: 28
06.06.2009, 18:10 #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, как у тебя
2
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:11  [ТС] #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;
}
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,629
Записей в блоге: 28
06.06.2009, 18:12 #6
Для strcpy что-то не нашёл ничего интересного, но там тоже могут быть какие-то замуты по поводу широкого копирования
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:13  [ТС] #7
А открытые библиотеки есть ?
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,629
Записей в блоге: 28
06.06.2009, 18:14 #8
Цитата Сообщение от #pragma Посмотреть сообщение
Правда этот вариант с char вроде потом переделали
Возможно. В детали реализации я не вникал, но суть того, откуда возникла такая большая процедура и, главное, зачем - я так думаю, ты понял

Добавлено через 1 минуту 0 секунд
Цитата Сообщение от #pragma Посмотреть сообщение
А открытые библиотеки есть ?
Есть glibc
Только не зная, как они устроены, временами бывает, что без поллитры не разберёшь, что, где и как реализовано. Для intel'а там скорее всего на ассемблере эти вещи написаны
1
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
07.06.2009, 12:06 #9
Что-то тут strcmp не то возвращает
1
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,629
Записей в блоге: 28
07.06.2009, 12:27 #10
Цитата Сообщение от Somebody Посмотреть сообщение
Что-то тут strcmp не то возвращает
Кстати да, возвращать должно 0, 1 или -1, т.е. результат сравнений "равно", "больше" или "меньше". А твой вариант умеет только "равно" и "не равно"
1
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
07.06.2009, 21:13  [ТС] #11
Да,я когда писал,подумал,что третьего не дано,или строки идентичны,или нет.
1
flexin777
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 5
10.04.2011, 15:23 #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;
}
По-моему,вот так будет правильнее
0
Evg
Эксперт CАвтор FAQ
18246 / 6371 / 438
Регистрация: 30.03.2009
Сообщений: 17,629
Записей в блоге: 28
10.04.2011, 15:28 #13
flexin777, strcpy возвращает неправильное значение, а strcmp работает в принципе неправильно (такое ощущение, что ты даже не знаешь, что она делает)
0
flexin777
0 / 0 / 0
Регистрация: 09.04.2011
Сообщений: 5
11.04.2011, 16:15 #14
Не могли бы Вы исправить,как правильно должно быть?
Я только учусь и может допустил ошибку.
Evg,заранее спасибо за ответ!
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
11.04.2011, 17:04 #15
flexin777, ты сначала разберись, что эти функции должны делать. Тогда решение станет очевидным. Прочитай где-нибудь описание этих функций, какие у них формальные параметры и возвращаемые значения.
0
11.04.2011, 17:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2011, 17:04
Привет! Вот еще темы с ответами:

Напишите свой аналог функций strlen() - C (СИ)
Пожалуйста, помогите написать свой аналог функций strlen()!!!!

Сравните числа - значения функций - Алгебра
2. Сравните числа a) cos(3*pi/7) и cos(2*pi/9); b) tg(9*pi/7) и tg(6*pi/5) Я вот что не пойму, как сделать эту задачу, чтобы не...

Написать аналог функций strcat и strcmp - C (СИ)
Помогите пожалуйста написать аналог функций strcat и strcmp на Си

Аналоги функций - Delphi
Здраствуйте решил перейти на дельфи с autoit и вот возникли вопросы,гугл ответов не дает... помогите ребята. в Autoit есть функция ...


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

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

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