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

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

05.11.2011, 18:37. Показов 8822. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2011, 18:37
Ответы с готовыми решениями:

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

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

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

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

31
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 19:13 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от softmob
C
1
char * mstrset(char *str, int c)
это что за функция ?
такой в языке нет

Цитата Сообщение от softmob
C
1
2
3
4
5
6
7
char * mstrcpy(char *dst, const char *src)
{
        char *res = dst;
        while(*src)     *dst++ = *src++;
        *dst = '\0';
        return res; 
}
C
1
2
3
4
5
6
7
char *mstrcpy(char *dst, const char *src)
{
    char *start = dst;
    while ((*dst++ = *src++))
        ;
    return start;
}
Цитата Сообщение от softmob
C
1
2
3
4
5
6
7
8
char * mstrcat(char *str1, const char *str2)
{
        char *res = str1;
        while(*++str1);
        while(*str2) *str1++ = *str2++;
        *str1 = '\0';
        return res;
}
для строки str1 с нуль-символом в начале может зациклиться
то же самое по поводу записи нуль-символа в конце (как в mstrcpy() )

в strcmp() обычно возвращается разность символов

Цитата Сообщение от softmob
C
1
const char * mstrchr(const char *str, int ch)
в C применение модификаторов к возвращаемому значению функции даёт неопределённое поведение
приводи в операторе return

в mstrchr()
если первый символ - тот, который нужен, а больше таких нет, то функция вернёт NULL
у тебя там и в mstrpbrk() такая же ошибка фигурирует
вообще, в mstrpbrk() слишком много букв и она запутанная
делай её без вызовов каких-либо функций

функцию mstrspn() перепутал с mstrcspn()
не понимаешь, как работает функция strcspn()

в функции mstrstr() вычисление несколько раз одного и того же занимает больше времени
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 20:45  [ТС] 3
accept, спасибо.
исправленная версия:
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
#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(*str1 && *str2)
    {
        if (*str1 != *str2)
        {
            if (*str1 > *str2) 
                return 1;
            else
                return -1;
        }
        *str1++;
        *str2++;
    }
    return 0;
}
 
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;
} 
 
int main(void)
{
    char str1[20]="abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
разве strset() нет?
почему же работает?
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char str1[20]= "12345";
    printf("%s", strset(str1, '0'));
    getchar(); 
    return 0;
}
насчет strspn()
функция strspn() возвращает индекс первого символа в строке str1, который не совпадает ни с одним из символов в строке str2. по этому описанию и делал.
strcmp() в VS с++ возвращает 1/0/-1..
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 21:29 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char line[100] = "abcd";
 
    strset(line, 'c');
    return 0;
}
Код
[guest@localhost tests]$ gcc -Wall t.c -o t
t.c: В функции ‘main’:
t.c:9:5: предупреждение: неявная декларация функции ‘strset’
/tmp/ccGbNFpd.o: In function `main':
t.c:(.text+0x42): undefined reference to `strset'
collect2: выполнение ld завершилось с кодом возврата 1
[guest@localhost tests]$
вот упоминание, что они из posix
но в posix 1003.1 их тоже нет

Цитата Сообщение от softmob
почему же работает?
это расширение компилятора

по функциям языка см здесь

Цитата Сообщение от softmob
функция strspn() возвращает индекс первого символа в строке str1, который не совпадает ни с одним из символов в строке str2
C89(draft)
Код
4.11.5.6 The strspn function

Synopsis

         #include <string.h>
         size_t strspn(const char *s1, const char *s2);

Description

   The strspn function computes the length of the maximum initial
segment of the string pointed to by s1 which consists entirely of
characters from the string pointed to by s2 .

Returns

   The strspn function returns the length of the segment.
ты привёл описание strcspn()
твоя функция якобы для strspn(), которая на самом деле для strcspn(), делает не то
она проверяет первый символ, не содержится ли он во второй строке, и если он не содержится, то возвращает ноль
1) её название происходит от слова span, поэтому ноль она возвращает, когда не может растянуться (охватить) вообще
2) она не должна останавливаться на первом символе, если там есть ещё подходящие

Цитата Сообщение от softmob
strcmp() в VS с++ возвращает 1/0/-1..
нет, по стандарту она возвращает больше нуля, равно, или меньше нуля

msdn. strcmp (это не стандарт, но здесь то же самое)
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 22:27  [ТС] 5
я не переводил, брал из интернета.
strcspn()
C
1
size_t strcspn(const char *str1, const char *str2);
Функция strcspn() возвращает длину начальной подстроки в строке, адресуемой параметром str1, которая не содержит ни одного символа из строки, адресуемой параметром str2. Другими словами, функция strcspn() возвращает индекс первого символа в строке str1, который совпадает с любым из символов в строке str2.

Пример

Следующая программа выводит число 6.
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
 
int main(void)
{
   int len;
 
   len = strcspn("это тест", "сл");
   printf("%d", len);
 
return 0;
}


strspn()
C
1
size_t strspn(const char *str1, const char *str2);
Функция strspn() возвращает длину начальной подстроки строки, адресуемой параметром str1. которая состоит татько из символов, содержащихся в строке, адресуемой параметром str2. Другими словами, функция strspn() возвращает индекс первого символа в строке str1, который не совпадает ни с одним из симваюв в строке str2.

Пример

Эта программа выводит число 11.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
int main(void)
{
   int len;
   
   len=strspn("это строка из примера", "акортэ с");
   printf("%d", len);
 
return 0;
}


во всяком случае mstrspn() и strspn()/mstrcspn() и strcspn() выдают одинаковый результат
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
#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(*str1 && *str2)
    {
        if (*str1 != *str2)
        {
            if (*str1 > *str2) 
                return 1;
            else
                return -1;
        }
        *str1++;
        *str2++;
    }
    return 0;
}
 
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 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);
}
 
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;
} 
 
int main(void)
{
    char str1[20]="abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от accept Посмотреть сообщение
нет, по стандарту она возвращает больше нуля, равно, или меньше нуля
ну а 1/0/-1 разве не больше нуля/равно/меньше нуля?

Цитата Сообщение от accept Посмотреть сообщение
в strcmp() обычно возвращается разность символов
так что ли
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int mstrcmp(const char *str1, const char *str2)
{
    while(*str1 && *str2)
    {
        if (*str1 != *str2)
        {
            if (*str1 > *str2) 
                return *str1 - *str2;
            else
                return *str1 - *str2;
        }
        *str1++;
        *str2++;
    }
    return 0;
}
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 22:42 6
а, не, всё правильно

Цитата Сообщение от softmob
так что ли
пример пример
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 22:43  [ТС] 7
C
1
2
3
4
5
6
7
8
9
int mstrcmp(const char *str1, const char *str2)
{
        while(*str1 && *str2 && *str1 == *str2)
        {
                *str1++;
                *str2++;
        }
        return (int)*str1 - (int)*str2;
}
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
05.11.2011, 22:49 8
Цитата Сообщение от softmob Посмотреть сообщение
*str1++;
*str2++;
Разыменовывать указатели здесь незачем.
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 22:56  [ТС] 9
Цитата Сообщение от accept Посмотреть сообщение
вот упоминание, что они из posix
но в posix 1003.1 их тоже нет


это расширение компилятора

по функциям языка см здесь
ну во всяком случае в вопросах к
лабе
Характеристика операций над символьными данными, обеспечиваемых библиотечными функциями С и алгоритмы их работы:
strlen( ) - определение длины строки;
strset( ) - заполнение строки заданным символом;
strnset( ) – заполнение части строки заданным символом;
strcpy( ) – копирование строки в строку;
strcat( ) – соединение (конкатенация) строк;
strcmp( ) – сравнение двух строк;
strtok( ) – поиск и выделение лексических единиц в строке;
strchr( ) – поиск заданного символа в строке;
strpbrk( ) – поиск первого вхождения символа из шаблона в строке
strspn( ) – определение длины начальной части строки-шаблона, которой нет в исследуемой строке;
strstr( ) – поиск подстроки в строке (по образцу).
Для указанных функций по алгоритмам составить программную реализацию.
strset( ) есть, и там почему то ее к функциям причислили
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 23:03 10
по стандарту пишут компиляторы
если будешь использовать нестандартные функции, то программу нельзя будет скомпилировать на большинстве компиляторов
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 23:18  [ТС] 11
strrchr() в нем нет, эт не ко мне вопрос)
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
#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(*str1 && *str2 && *str1 == *str2)
    {
        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 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);
}
 
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;
} 
 
int main(void)
{
    char str1[20]="abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
Добавлено через 10 минут
Цитата Сообщение от accept Посмотреть сообщение
если будешь использовать нестандартные функции, то программу нельзя будет скомпилировать на большинстве компиляторов
за 2 месяца пока ток синтаксис и некоторые функции дали.
подойдет ли "Язык программирования C. Брайан Керниган, Деннис Ритчи" для ознакомление со стандартом?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 23:21 12
Цитата Сообщение от softmob
подойдет ли "Язык программирования C. Брайан Керниган, Деннис Ритчи" для ознакомление со стандартом?
да, там краткая форма в конце
и в книге нет нестандартных функций (самописные не в счёт)
0
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
05.11.2011, 23:31  [ТС] 13
с strtok() помоги разобраться, из списка ток её не сделал. чет не понял даже как просто пользоваться ей..
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
05.11.2011, 23:49 14
minix. strtok
glibc. strtok

описание здесь
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
06.11.2011, 17:30  [ТС] 15
вроде работает..
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
char * mstrtok(char *str1, const char *str2)
{
    size_t f, r = 0;
    char *res;
    const char *tmp;
    static char *save;
    if (!str1) str1 = save; else save = str1;
    if (!*str1) return NULL;
    res = str1;
    tmp = str2;
 
    while(*str1)
    {
        f = 1;
        while(*str2)
        {
            if (*str1 == *str2) 
            {
                f = 0; 
                break;
            }
            str2++;
        }
        str2 = tmp;
        if (f) r++;
        if (!f && !r) res++;
        if (!f && r)
        {
            *str1 = '\0'; 
            save++;  
            break;
        }
        str1++;
        save++;
    }   
    return res;
}
Добавлено через 3 часа 10 минут
какие еще функции работы с строками неплохо бы разобрать?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.11.2011, 17:38 16
strncat(), strncpy(), strncmp()
0
Заблокирован
06.11.2011, 18:06 17
Я все ваши функции внимательно не смотрел, но сразу же бросается в глаза, что у вас некорректно определена функция mstrcmp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;
}
Дело в том, что тип char может вести себя и как unsigned char, и как signed char. Выбор поведения типа char по умолчанию оставлен на усмотрение разработчиков компиляторов, и кроме того пользователь с помощью опций компилятора сам может задавать поведение типа char Поэтому при сравнении символов вам надо явно их приводить к типу unsigned char.Иначе результат будет неверным.

Об этом в том числе говорится и в стандарте, что символы в этой функции должны сравниваться как символы, имеющие тип unsigned char.
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
06.11.2011, 18:47  [ТС] 18
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
#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(*str1 && *str2 && (unsigned char)*str1 == (unsigned char)*str2)
    {
        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;
} 
 
int main(void)
{
    char str1[20]="abc";
    printf("%s", mstrcat(str1, "12345"));
    getchar(); 
    return 0;
}
Добавлено через 6 минут
strncat(),

C
1
2
3
4
5
6
7
8
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;
}
strncpy(),

C
1
2
3
4
5
6
char * mstrncpy (char *dst, const char *src, size_t len)
{
        char *res = dst;
        while(len-- && (*dst++ = *src++));
        return res; 
}
strncmp()
C
1
2
3
4
5
6
7
8
9
int mstrncmp(const char *str1, const char *str2, size_t count)
{
        while(--count && (*str1 && *str2 && (unsigned char)*str1 == (unsigned char)*str2)
        {
                str1++;
                str2++;
        }
        return (int)*str1 - (int)*str2;
}


strcspn()
C
1
2
3
4
5
6
7
8
9
10
11
12
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);
}


и
strlcpy()
C
1
2
3
4
5
6
7
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; 
}
хотя правда нестандартная функция..
0
Заблокирован
06.11.2011, 18:51 19
Вам нет нужды в функции mstrcmp одновременно проверять на завершающий ноль обе строки. Так как если одна строка длиннее другой, то очевидно символы, соответствующие положению нулевого символа более короткой строки, будут не равны между собой.
1
1255 / 705 / 359
Регистрация: 20.02.2010
Сообщений: 1,035
06.11.2011, 19:14  [ТС] 20
какие еще будут замечания?
функции работы со строками
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
#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(*str1 && (unsigned char)*str1 == (unsigned char)*str2)
    {
        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 && (*str1 && (unsigned char)*str1 == (unsigned char)*str2))
    {
        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
06.11.2011, 19:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.11.2011, 19:14
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru