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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Есть ли C++ нативный способ быстро обнулить массив (аналог bzero)? + ещё 2 вопроса http://www.cyberforum.ru/cpp-beginners/thread38637.html
Второй вопрос - если конструктор обнаружил условия, препятствующие созданию объекта, есть ли способ "не создавать" объект и не использовать потом дестуктор? Третий - стоит ли использовать динамические переменны внутри локальной области видимости(создать и удалить перед выходом из этой области) Спасибо
C++ функция разбивает файл на биты.... Написать функцию,разбивающую файл на биты и записывающую последовательно эти биты с интервалом в 24 байт в другой файл. В случае нехватки длины 2-го файла вывести предупреждение сообщение и прекратить работу. http://www.cyberforum.ru/cpp-beginners/thread38636.html
Рассортировать строки матрицы по возрастанию первых элементов строк C++
8. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк проблема в том, что матрица триугольная и никак строки не поменяешь местами пишет ошибку. значет надо менять адреса а как? вот мой код int main () { int n; cout<<"Enter size"<<endl; cin>>n; int **arrow=new int*;
C++ Сохранение изображения
Моя программа похожа на PAINT только под DOS в Borland C 3.1. Как мне сохранять рисунки которые я рисую?
C++ Изобразить движение по спирали http://www.cyberforum.ru/cpp-beginners/thread38629.html
Помогите зделать движение по спирали(на рисунку). Я так понимаю надо двигатса по елипсу и смещать центр, но не знаю как это зделать.
C++ Двумерные массивы (+символьные) Вот 5 задач... необходимо помочь братишке... сам я в С++ не особо силен... Сильно прошу вас помочь мне... За оказанную услугу готов оказать услугу написания сайта) очень жду помощи... 1) Дан двумерный массив целых чисел. а) Сформировать одномерный массив, каждый элемент которого ра- вен наибольшему по модулю элементу соответствующего столбца двумерного массива. б) Сформировать... подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
06.06.2009, 18:11  [ТС]     Напишите свои аналоги функций strlen(), strcpy(), strcmp() и сравните с библиотечными.
Только сейчас дошло,что вся библиотека имеет закрытый код...Это правда так?? Очень печально.Насчёт инкремента спасибо,постараюсь запомнить.Правда этот вариант с 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;
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru