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

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

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

Author24 — интернет-сервис помощи студентам
надо было написать свои функции работы со строками аналогичные функциям из <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(...

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

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

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

31
Заблокирован
06.11.2011, 19:21 21
Author24 — интернет-сервис помощи студентам
Я бы в функции mstrcmp поменял бы местами логические выражения. Так как если символы строк не равны между собой, то второе логическое выражение проверки на нулевой символ лишнее.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.11.2011, 00:42 22
Цитата Сообщение от 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  [ТС] 23
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  [ТС] 24
C
1
2
const char *str = "test";
str++;
Препод утверждает что нельзя изменить указатель, хотя я знаю что в данном случае константа содержимое а не сам указатель. Как ему доказать что он не прав?(не в стандарт же посылать)
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:06 25
Интересный момент. А вы не проводили сравнительный временной тест ваших функций и их аналогов из <string.h>?
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 14:13  [ТС] 26
когда писал все функции тестировал в паре с функциями из <string.h> результат был одинаков. тест на время не делал.
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:16 27
Интересно было бы посмотреть тест на время
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 14:22  [ТС] 28
через пол часа будет пара по программированию, как преподавателю обосновать насчет const?
const char *str;
char * const str;
В первом случае константа содержимого, во втором сам указатель. Но этого думаю будет недостаточно..
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
02.12.2011, 14:29 29
Цитата Сообщение от softmob Посмотреть сообщение
В первом случае константа содержимого, во втором сам указатель. Но этого думаю будет недостаточно..
Так и объясните. Если у него есть голова, то хотя бы задумается.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
02.12.2011, 16:16 30
Цитата Сообщение от softmob Посмотреть сообщение
Препод утверждает что нельзя изменить указатель
пусть докажет
приведи ему пример стандартных функций
printf(), strcmp(), ...
найди исходники apple для стандартных функций, покажи ему их (сам он их, похоже, не читал ни разу)
пример
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
02.12.2011, 20:21  [ТС] 31
Цитата Сообщение от Thinker Посмотреть сообщение
Так и объясните. Если у него есть голова, то хотя бы задумается.
да этого вполне хватило.
он сослался что раньше
C
1
const char *str;
делало константой указатель.

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Как запретить подсветку выделенного текста с помощью CSS
InfoMaster 20.01.2025
Подсветка текста при выделении является стандартным поведением браузера, которое не всегда соответствует дизайнерским решениям или функциональным требованиям веб-приложения. Выделение текста может. . .
Как выполнить другую программу или системную команду из Python
InfoMaster 20.01.2025
Python предоставляет мощные инструменты для выполнения системных команд и управления внешними процессами, что делает его идеальным выбором для автоматизации различных задач системного. . .
Как узнать директорию bash-скрипта из самого bash-скрипта
InfoMaster 20.01.2025
При разработке bash-скриптов одной из важных задач является определение директории, в которой находится исполняемый скрипт. Это критически важно для корректной работы с файлами, загрузки конфигураций. . .
В чем разница между let и var в JavaScript
InfoMaster 20.01.2025
JavaScript прошел длинный путь эволюции с момента своего создания в 1995 году. Одним из важнейших аспектов развития языка стало совершенствование механизмов объявления и управления переменными. . . .
Эффективная работа со строками в Go
InfoMaster 20.01.2025
Язык программирования Go предлагает уникальный подход к работе со строками, который существенно отличается от многих других языков программирования. В Go строки представляют собой неизменяемые. . .
Как проверить, что отображение (map) содержит ключ в Go
InfoMaster 20.01.2025
Отображения (maps) в языке программирования Go представляют собой мощные структуры данных, которые позволяют хранить пары ключ-значение и обеспечивают быстрый доступ к данным по уникальным. . .
Как организовать домашнее хранилище фильмов с общим доступом для всей семьи
InfoMaster 20.01.2025
Преимущества домашнего медиасервера В современном мире, где цифровой контент стал неотъемлемой частью нашей жизни, организация домашнего медиасервера становится все более актуальной задачей. . . .
Перспективы развития жестких дисков: есть ли у них будущее?
InfoMaster 20.01.2025
История и эволюция жестких дисков История развития жестких дисков начинается в 1956 году, когда компания IBM представила первое устройство для хранения данных на магнитных пластинах - IBM 350. . .
Распознавание изображений (компьютерное зрение) на C++
InfoMaster 20.01.2025
Введение в компьютерное зрение и основы работы с изображениями Компьютерное зрение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, позволяющую. . .
Какой язык программировани­я лучший для разработки нейронных сетей
InfoMaster 20.01.2025
В современном мире технологий искусственные нейронные сети становятся неотъемлемой частью множества инновационных решений, от распознавания речи до автоматического управления транспортными. . .
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru