Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/43: Рейтинг темы: голосов - 43, средняя оценка - 4.51
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035

Написать свои функции работы со строками аналогичные функциям из <string.h>

05.11.2011, 18:37. Показов 9582. Ответов 31
Метки нет (Все метки)

надо было написать свои функции работы со строками аналогичные функциям из <string.h>
проверьте, пожалуйста:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <stdio.h>
 
size_t mstrlen(const char *str)
{   
    size_t res = 0;
    while(*str++)
        res++;
    return res;
}
 
char * mstrset(char *str, int c)
{
    char *res = str;
    while(*str) *str++ = c;
    *str = '\0';
    return res;
}
 
char * mstrnset(char *str, int c, unsigned int n)
{
    size_t i;
    char *res = str;
    if (n > mstrlen(str)) n = mstrlen(str);
 
    for(i = 0; i < n; i++)
        *str++ = c;
    return res;
}
 
char * mstrcpy(char *dst, const char *src)
{
    char *res = dst;
    while(*src) *dst++ = *src++;
    *dst = '\0';
    return res; 
}
 
char * mstrcat(char *str1, const char *str2)
{
    char *res = str1;
    while(*++str1);
    while(*str2) *str1++ = *str2++;
    *str1 = '\0';
    return res;
}
 
int mstrcmp(const char *str1, const char *str2)
{
    while(*str1 && *str2)
    {
        if (*str1 != *str2)
        {
            if (*str1 > *str2) 
                return 1;
            else
                return -1;
        }
        *str1++;
        *str2++;
    }
    return 0;
}
 
const char * mstrchr(const char *str, int ch)
{
    while(*str)
        if (*++str == ch) return str;
    return NULL;
}
 
const char * mstrpbrk(const char *str1, const char *str2)
{
    const char *res = str1, *rest , *t;
    size_t i;
    while(*++res);
    rest = res;
    for(i = 0; i < mstrlen(str2); i++)
    {
        t = mstrchr(str1, str2[i]);
        if (t && t <= res) res = t;
    }
    if (res != rest) 
        return res;
    else
        return NULL;
}
 
size_t mstrspn(const char *str1, const char *str2)
{
    size_t i, j, f;
    for(i = 0; i < mstrlen(str1); i++)
    {
        f = 0;
        for(j = 0; j < mstrlen(str2); j++)
        {
            if (str1[i] != str2[j]) f++;
        }
        if (f == mstrlen(str2)) return i;
    }
    return mstrlen(str1);
}
 
const char * mstrstr(const char *str1, const char *str2)
{
    size_t i, j, f;
    for(i = 0; i < mstrlen(str1) - mstrlen(str2) + 1; i++)
    {
        f = 0;
        for(j = 0; j < mstrlen(str2); j++)
        {
            if (str1[i + j] == str2[j]) f++;
        }
        if (f == mstrlen(str2)) return str1 + i;
    }
    if (mstrlen(str2))
        return NULL;
    else 
        return str1;
}
 
int main(void)
{
    char str1[20]="abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
какие есть ошибки, замечания?
не разобрался с функцией strtok(), чет не получилось даже просто использовать её..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2011, 18:37
Ответы с готовыми решениями:

Есть ли в С# функции, аналогичные функциям WinAPI?
Добрый день, подскажите, есть ли в С# функции, аналогичные winapi функциям? - BOOL GetUserName( LPTSTR lpBuffer, LPDWORD nSize); -...

Как на php реализовать функции аналогичные функциям броузера 'назад', 'обновить' и др.?
Подскажите как на php реализовать функции аналогичные функциям броузера 'назад', 'обновить' и др.

ВопросЫ по функциям для работы со строками с++
Вот я нашел большинство (если не все) стандартные функции C++ для работы со строками: Я вычитал что функция memcpy копирует за такт...

31
Заблокирован
06.11.2011, 19:21
Я бы в функции mstrcmp поменял бы местами логические выражения. Так как если символы строк не равны между собой, то второе логическое выражение проверки на нулевой символ лишнее.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 00:42
Цитата Сообщение от softmob
какие еще будут замечания?
не пиши код в одну строчку
1) можно допустить синтаксическую ошибку и не заметить
2) представь, что компилятор на строку if (*str1) *str1 = '\0'; тебе пишет "строка 10: ошибка в разыменовании указателя". Про какой именно речь ? Чтобы это узнать, нужно их разделить, чтобы они стояли на разных строках. Поэтому это нужно делать сразу.

было
C
1
2
3
4
5
6
7
8
9
//другие функции
char * mstrncat(char *str1, const char *str2, size_t count)
{
        char *res = str1;
        while(*str1) str1++;
        while(count-- && (*str1++ = *str2++));
        if (*str1) *str1 = '\0';
        return res;
}
стало
C
1
2
3
4
5
6
7
8
9
10
11
12
13
//другие функции
char *mstrncat(char *str1, const char *str2, size_t count)
{
        char *res = str1;
        
        while (*str1)
            str1++;
        while(count-- && (*str1++ = *str2++))
            ;
        if (*str1)
            *str1 = '\0';
        return res;
}
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
07.11.2011, 20:07  [ТС]
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include <stdio.h>
//функции к лабе
size_t mstrlen(const char *str)
{       
    size_t res = 0;
    while(*str++)
        res++;
    return res;
}
 
char * mstrset(char *str, int c)
{
    char *res = str;
    while(*str) 
        *str++ = c;
    *str = '\0';
    return res;
}
 
char * mstrnset(char *str, int c, size_t n)
{
    size_t i;
    char *res = str;
    if (n > mstrlen(str)) 
        n = mstrlen(str);
    for(i = 0; i < n; i++)
        *str++ = c;
    return res;
}
 
char * mstrcpy(char *dst, const char *src)
{
    char *res = dst;
    while(*dst++ = *src++);
    return res; 
}
 
char * mstrcat(char *str1, const char *str2)
{
    char *res = str1;
    while(*str1) 
        str1++;
    while(*str1++ = *str2++);
    return res;
}
 
int mstrcmp(const char *str1, const char *str2)
{
    while((unsigned char)*str1 == (unsigned char)*str2 && *str1)
    {
        str1++;
        str2++;
    }
    return (int)*str1 - (int)*str2;
}
 
char * mstrchr(const char *str, int ch)
{
    while(*str)
    {
        if (*str == ch) 
            return (char* const)str;
        str++;
    }
    return NULL;
}
 
char * mstrpbrk(const char *str1, const char *str2)
{
    size_t i, j, f, r = mstrlen(str1);              
    for(i = 0; i < mstrlen(str2); i++)
    {
        f = 0;
        for(j = 0; j < mstrlen(str1); j++)
        {
            if (str1[j] == str2[i]) 
            {
                f = 1; 
                break;
            }
        }
        if (f && j < r) 
            r = j;
    }
    if (r != mstrlen(str1)) 
        return (char* const)str1 + r;
    else
        return NULL;
}
 
size_t mstrspn(const char *str1, const char *str2)
{
    size_t i, j, f;
    for(i = 0; i < mstrlen(str1); i++)
    {
        f = 0;
        for(j = 0; j < mstrlen(str2); j++)
        {
            if (str1[i] != str2[j]) 
                f++;
        }
        if (f == mstrlen(str2)) 
            return i;
    }
    return mstrlen(str1);
}
 
char * mstrstr(const char *str1, const char *str2)
{
    size_t i, j, f;
    for(i = 0; i < mstrlen(str1) - mstrlen(str2) + 1; i++)
    {
        f = 0;
        for(j = 0; j < mstrlen(str2); j++)
        {
            if (str1[i + j] == str2[j]) 
                f++; 
            else 
                break;
        }
        if (f == mstrlen(str2)) 
            return (char* const)str1 + i;
    }
    if (mstrlen(str2))
        return NULL;
    else 
        return (char* const)str1;
} 
 
//другие функции
char * mstrncat(char *str1, const char *str2, size_t count)
{
    char *res = str1;
    while(*str1) 
        str1++;
    while(count-- && (*str1++ = *str2++));
    if (*str1) 
        *str1 = '\0';
    return res;
}
 
char * mstrncpy (char *dst, const char *src, size_t len)
{
    char *res = dst;
    while(len-- && (*dst++ = *src++));
    return res; 
}
 
int mstrncmp(const char *str1, const char *str2, size_t count)
{
    while(--count && ((unsigned char)*str1 == (unsigned char)*str2) && *str1)
    {
        str1++;
        str2++;
    }
    return (int)*str1 - (int)*str2;
}
 
size_t mstrlcpy (char *dst, const char *src, size_t size) //нестандартная функция
{
    size_t res = mstrlen(src); 
    while(--size > 0 && (*dst++ = *src++));
    if (*dst) 
        *dst = '\0';
    return res; 
}
 
size_t mstrcspn(const char *str1, const char *str2)
{
    size_t i, j;
    for(i = 0; i < mstrlen(str1); i++)
    {
        for(j = 0; j < mstrlen(str2); j++)
        {
            if (str1[i] == str2[j]) 
                return i;
        }
    }
    return mstrlen(str1);
}
 
int main(void)
{
    char str1[20] = "abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 13:41  [ТС]
C
1
2
const char *str = "test";
str++;
Препод утверждает что нельзя изменить указатель, хотя я знаю что в данном случае константа содержимое а не сам указатель. Как ему доказать что он не прав?(не в стандарт же посылать)
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:06
Интересный момент. А вы не проводили сравнительный временной тест ваших функций и их аналогов из <string.h>?
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 14:13  [ТС]
когда писал все функции тестировал в паре с функциями из <string.h> результат был одинаков. тест на время не делал.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:16
Интересно было бы посмотреть тест на время
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 14:22  [ТС]
через пол часа будет пара по программированию, как преподавателю обосновать насчет const?
const char *str;
char * const str;
В первом случае константа содержимого, во втором сам указатель. Но этого думаю будет недостаточно..
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:29
Цитата Сообщение от softmob Посмотреть сообщение
В первом случае константа содержимого, во втором сам указатель. Но этого думаю будет недостаточно..
Так и объясните. Если у него есть голова, то хотя бы задумается.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.12.2011, 16:16
Цитата Сообщение от softmob Посмотреть сообщение
Препод утверждает что нельзя изменить указатель
пусть докажет
приведи ему пример стандартных функций
printf(), strcmp(), ...
найди исходники apple для стандартных функций, покажи ему их (сам он их, похоже, не читал ни разу)
пример
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 20:21  [ТС]
Цитата Сообщение от Thinker Посмотреть сообщение
Так и объясните. Если у него есть голова, то хотя бы задумается.
да этого вполне хватило.
он сослался что раньше
C
1
const char *str;
делало константой указатель.

ну всё сдал все отчеты и теории по программированию на этот семестр
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.12.2011, 22:00
Цитата Сообщение от softmob
он сослался что раньше
делало константой указатель.
и раньше не делало, раньше const вообще не было
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2011, 22:00

Работа со строками. Функции работы со строками
Дана строка символов. В заданном тексте определить позицию первой точки ‘ . ‘.

Создать класс String для работы со строками
Здраствуйте! Создать класс String для работы со строками,аналогичными строкам Turbo Pascal (строка представляется как массив 255...

Создайте класс String для работы со строками
народ помогите пожалуйста, классы тяжко даются:( 1. код корректен? 2. не могу сообразить как написать функцию bool hasSubstring # ...

Разработать класс String для работы со строками
разработать класс String для работы со строками. Класс должен содержать контср по умолчанию, контсруктор копирования. Перегрузить в этом...

Разработать класс String для работы со строками
/*Разработать класс String для работы со строками. Класс должен содержать: - Конструктор по умолчанию, позволяющий создать строку...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru