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

Указатели char* - конкатенация без <string.h> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
10.06.2011, 02:03     Указатели char* - конкатенация без <string.h> #1
C++
1
2
3
4
5
6
7
8
char *pp,*p,*s1;
 
[...] // p и s1 имеют свои значения, по сути необходимо из "p" сделать соединение "s1+p" (строго без <string.h> ! это значение будет храниться в "p")
 
*pp = *p;
*p = *s1;
while(*(p++));
*p = *pp;
В таком вот небольшом отрывочке кода есть один большой недостаток: он работает только с первыми символами строк. Я попытался как-то уладить эту проблему. Но следующий код работает вообще безобразно:

C++
1
2
3
4
while(*p)  { *pp++ = *p++; i++; } *pp-=i; *p-=i; i=0;
while(*s1) { *p++ = *s1++; i++; } *p-=i; *s1-=i; i=0;
while(*(p++));
while(*pp) { *p++ = *pp++; i++; } *p-=i; *pp-=i; i=0;
Подскажите, как решается данная проблема.
Код должен быть примерно таким, разница только в неучтённых ньюансах. Я только знакомлюсь с указателями, поэтому мог много чего не учесть. Подскажите, как мне исправиться.

Благодарю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2011, 06:53     Указатели char* - конкатенация без <string.h> #2
Если нужно именно через указатели, то вот:
C++
1
2
3
4
5
char str1[12]={"Hello "};//в первой строке должно быть достаточно места, чтоб вместить вторую
char str2[]={"World"};
char *ptr1=str1+strlen(str1), *ptr2=str2;
while(*ptr1++=*ptr2++);
*ptr1='\0';
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
10.06.2011, 07:02     Указатели char* - конкатенация без <string.h> #3
strlen разве не из string.h? надо сначала длину первой строки вычислить простым циклом пока нулевой символ не встретиться, а потом склеивать. Поэтому чар говно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2011, 07:11     Указатели char* - конкатенация без <string.h> #4
strlen разве не из string.h? надо сначала длину первой строки вычислить простым циклом
Это я так, чтоб показать, как конкатенировать строки.
Поэтому чар говно
??? Обычный массив байт.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
10.06.2011, 08:01     Указатели char* - конкатенация без <string.h> #5
ну всмысле скорости работы, его только в учебных целях и осталось использовать
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.06.2011, 08:35     Указатели char* - конкатенация без <string.h> #6
Цитата Сообщение от x-positive
Подскажите, как решается данная проблема.
нужно читать про операции и циклы

C
1
2
3
4
5
6
7
8
    char s1[100] = "abcd";
    char s2[] = "efgh";
    char *p1, *p2;
 
    for (p1 = s1; *p1 != '\0'; p1++)
        ;
    for (p2 = s2; (*p1 = *p2) != '\0'; p1++, p2++)
        ;
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
10.06.2011, 08:43  [ТС]     Указатели char* - конкатенация без <string.h> #7
На счёт длины: они все имеют равную длину, больше длины содержащегося в них текста.
Что касается char*pp в моём коде - я решил объявлять её так - char *pp=(char*)malloc(MAX);

вообще, мой код выглядит подобным образом, но вызывает сбой программы и завершение с ошибкой.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char* StrIns(char*s,char*s1,char*p)
{
 int i=1;
 char *pp=(char*)malloc(MAX);
 
 while(*p)  { *pp++ = *p++; i++; } *pp = '\0'; *pp-=i; *p-=i; i=0;
 while(*s1) { *p++ = *s1++; i++; } *p = '\0'; *p-=i; *s1-=i; i=0;
 while(*(p++));
 while(*pp) { *p++ = *pp++; i++; } *p = '\0'; *p-=i; *pp-=i; i=0;
 
 free(pp);
 return s;
}
пересылаемые строки char*s,char*s1,char*p оглашаются char s[MAX],*space="_",*find; и инициализируются пользователем с клавиатуры, кроме find - сохраняет значение одной искомой подстроки... да что уж там
полный код программы
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 128
#define ENTER '\r'
 
char* StrStr(char*s, char*s1)
{
 char *copy_s, *copy_s1 = s1;
 while (*s)
  {
   copy_s = s;
   if(*s++ == *s1++) return copy_s;
   s1 = copy_s1;
  }
 return NULL;
}
 
char* StrIns(char*s,char*s1,char*p)
{
 int i=1;
 char *pp=(char*)malloc(MAX);
 
 while(*p)  { *pp++ = *p++; i++; } *pp = '\0'; *pp-=i; *p-=i; i=0;
 while(*s1) { *p++ = *s1++; i++; } *p = '\0'; *p-=i; *s1-=i; i=0;
 while(*(p++));                                        
 while(*pp) { *p++ = *pp++; i++; } *p = '\0'; *p-=i; *pp-=i; i=0;
 
 free(pp);
 return s;
}
 
main()
{
 char s[MAX],s1[MAX],*space="_",*find=(char*)malloc(MAX);
 int i=0,len_S1;
 char* StrStr(char*,char*);
 char* StrIns(char*,char*,char*);
 
 printf("s = ");
 do s[i]=getche();
 while(s[i++]!=ENTER);
 s[i-1]='\0';
 i=0;
 
 printf("\n\ns1= ");
 do s1[i]=getche();
 while(s1[i++]!=ENTER);
 s1[i-1]='\0';
 len_S1=i-1;
 
 puts("\n\nResults:\n");
 
 if (find = StrStr(s,s1))
 {
  do
  {
    StrIns(s,space,find);
    StrIns(s,space,find+len_S1+1);
    find+=len_S1+2;
  }
  while (find = StrStr(find+=len_S1,s1));
  puts(s);
 }
 else printf("Not found s1 in s.");
 
 getch();
 return 0;
}
(причём всё работало безупречно, кроме второй функции. она то и вызывает сбой.)
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
10.06.2011, 08:57  [ТС]     Указатели char* - конкатенация без <string.h> #8
Цитата Сообщение от accept Посмотреть сообщение
нужно читать про операции и циклы
Кстати, первой мое попыткой было реализовать это с помощью for. Попытка оказалась намного более громоздкой и провальной, к тому же запутаннее. Возможно потому что нужно читать про циклы.

А вот здесь по-моему так нужно? :
Цитата Сообщение от accept Посмотреть сообщение
нужно читать про операции и циклы

C
1
2
3
4
5
6
7
8
9
    char s1[100] = "abcd";
    char s2[] = "efgh";
    char *p1, *p2;
 
    for (p1 = s1; *p1 != '\0'; p1++)
        ;
    for (p2 = s2; (*p1 = *p2) != '\0'; p1++, p2++)
        ;
   *p1 = '\0' ;
Чтож, я учусь ещё. Не судите строго. Я за C++ взялся только с Февраля...

Добавлено через 6 минут
Кстати заметил что вместо

C++
1
2
3
4
while(*p)  { *pp++ = *p++; i++; } *pp = '\0'; *pp-=i; *p-=i; i=0;
while(*s1) { *p++ = *s1++; i++; } *p = '\0'; *p-=i; *s1-=i; i=0;
while(*(p++));                                        
while(*pp) { *p++ = *pp++; i++; } *p = '\0'; *p-=i; *pp-=i; i=0;
Можно написать

C++
1
2
3
 while(*p)  { *pp++ = *p++; i++; } *pp = '\0'; *pp-=i; *p-=i; i=0;
 while(*s1) { *p++ = *s1++; i++; } i=0;
 while(*pp) { *p++ = *pp++; i++; } *p = '\0'; *p-=i; *pp-=i; i=0;
И что будет то же самое..
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.06.2011, 09:33     Указатели char* - конкатенация без <string.h> #9
C
1
*p1 = '\0' ;
это не нужно

не пиши код в одну строчку, это мешает поддержке(maintenance)
отладчик сообщает строку, а когда в ней несколько операторов, непонятно, в каком именно ошибка
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
10.06.2011, 09:53  [ТС]     Указатели char* - конкатенация без <string.h> #10
Цитата Сообщение от accept Посмотреть сообщение
не пиши код в одну строчку, это мешает поддержке(maintenance)
отладчик сообщает строку, а когда в ней несколько операторов, непонятно, в каком именно ошибка
да я обычно и не пишу, это я сейчас пока программу не дописал.
тем более что компиляция ошибок не выдаёт, а в отладчике я пока не понимаю указаний на ошибки...

Добавлено через 11 минут
Вот, может вам будет легче:

C++
1
2
3
4
5
6
7
8
 while(*p)  { *pp++ = *p++; i++; } *pp = '\0';
 *pp-=i;
 *p-=i;
 i=0;
 while(*s1) { *p++ = *s1++; i++; };
 i=0;
 while(*pp) { *p++ = *pp++; i++; } *p = '\0';
 *p-=i;
С учётом этого
полный код программы выглядит следующим образом.
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 128
#define ENTER '\r'
 
char* StrStr(char*s, char*s1)
{
 char *copy_s, *copy_s1 = s1;
 while (*s)
  {
   copy_s = s;
   if(*s++ == *s1++) return copy_s;
   s1 = copy_s1;
  }
 return NULL;
}
 
char* StrIns(char*s,char*s1,char*p)
{
 int i=1;
 char *pp=(char*)malloc(MAX);
 
 while(*p)  { *pp++ = *p++; i++; } *pp = '\0';
 *pp-=i;
 *p-=i;
 i=0;
 while(*s1) { *p++ = *s1++; i++; };
 i=0;
 while(*pp) { *p++ = *pp++; i++; } *p = '\0';
 *p-=i;
 
 free(pp);
 return s;
}
 
main()
{
 char s[MAX],s1[MAX],*space="_",*find=(char*)malloc(MAX);
 int i=0,len_S1;
 char* StrStr(char*,char*);
 char* StrIns(char*,char*,char*);
 
 printf("s = ");
 do s[i]=getche();
 while(s[i++]!=ENTER);
 s[i-1]='\0';
 //len_S=i-1;
 i=0;
 
 printf("\n\ns1= ");
 do s1[i]=getche();
 while(s1[i++]!=ENTER);
 s1[i-1]='\0';
 len_S1=i-1;
 
 puts("\n\nResults:\n");
 
 if (find = StrStr(s,s1))
 {
  do
  {
    StrIns(s,space,find);
    StrIns(s,space,find+len_S1+1);
    find+=len_S1+2;
  }
  while (find = StrStr(find+=len_S1,s1));
  puts(s);
 }
 else printf("Not found s1 in s.");
 
 getch();
 return 0;
}
(ага, и всё также выдаёт сбой...)

P.S. Пытаюсь понять что пишет отладчик, но он указывает на адрес, который я вообще не могу найти в программе. С отладчиком я пока не дружу..
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
10.06.2011, 10:52     Указатели char* - конкатенация без <string.h> #11
Цитата Сообщение от x-positive
да я обычно и не пишу, это я сейчас пока программу не дописал.
C++
1
    while(*p)  { *pp++ = *p++; i++; } *pp = '\0';
C++
1
2
3
4
5
    while (*p) {
        *pp++ = *p++;
        i++;
    }
    *pp = '\0';
Добавлено через 11 минут
Цитата Сообщение от x-positive
полный код программы выглядит следующим образом
функция getche(), которая может отсутствовать в каком-нибудь компиляторе, или работать не так, как ожидается

C
1
while (find = StrStr(find+=len_S1,s1));
запутанные конструкции
изменение find, когда там адрес выделенной памяти
нет free(find) в конце

C
1
if (find = StrStr(s,s1))
потеря указателя из find происходит ещё на раннем этапе

C
1
2
3
4
5
6
7
8
9
10
11
char* StrStr(char*s, char*s1)
{
 char *copy_s, *copy_s1 = s1;
 while (*s)
  {
   copy_s = s;
   if(*s++ == *s1++) return copy_s;
   s1 = copy_s1;
  }
 return NULL;
}
strstr() ищет подстроку в строке, здесь даже близко этого не происходит

C++
1
2
3
char* StrIns(char*s,char*s1,char*p)
{
 int i=1;
функция получает три указателя зачем-то
функция использует переменную i, которая вообще не нужна
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
10.06.2011, 10:59     Указатели char* - конкатенация без <string.h> #12
Цитата Сообщение от pito211 Посмотреть сообщение
ну всмысле скорости работы, его только в учебных целях и осталось использовать
String'и медленне в работе, чем массив char'ов. Потому как string - это тот же массив char, только там еще затраты на выделение/перевыделение памяти.

Или имелась ввиду скорость работы программиста? Тогда да, string конечно удобнее.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
10.06.2011, 11:41     Указатели char* - конкатенация без <string.h> #13
Цитата Сообщение от Kastaneda Посмотреть сообщение
String'и медленне в работе, чем массив char'ов. Потому как string - это тот же массив char, только там еще затраты на выделение/перевыделение памяти.
в данной теме речь идёт о конкатенации и строки в стиле си явно не самые быстрые в этом плане. Из-за алгоритма маляра Шлемиля
-=ЮрА=-
Заблокирован
Автор FAQ
10.06.2011, 12:42     Указатели char* - конкатенация без <string.h> #14
Насколько понял нужно реализовать поиск подстроки и вставку строки без 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
#include <stdio.h>
#include <windows.h>
 
int sLen = 0;
int str_get_len(char * str);
char * str_text = (char *) malloc(sizeof(char));
char * get_text(char * str, char ch_end,int &sLen);
char * str_str(char * str, char * fnd);
char * str_ins(char * str, char * ins, int pos);//Вставить ins в str с позиции pos
 
void main()
{
    printf("ENTER INPUT TEXT\r\n");
    //Проверял на вводе с клавиатуры строки "123 567"
    str_text = get_text(str_text, '\n',sLen);
    printf("%s\r\n",str_text);
    printf("%d\r\n",str_get_len(str_text));
    printf("%s\r\n",str_str(str_text, "567"));
    printf("%s\r\n",str_ins(str_text, "89", 3));
}
 
char * get_text(char * str, char ch_end,int &sLen)
{
    if(str)
    {
        sLen = 0;
        while((str[sLen] = getchar()) != ch_end)
            str = (char *)realloc(str, 
            (1 + (sLen = sLen + 1))*sizeof(char));
        str[sLen] = '\0';
    }
    return str;
}
 
int str_get_len(char * str)
{
    int sLen = 0;
    while((str + sLen)[0] != '\0')
        sLen++;
    return sLen;
}
 
char * str_str(char * str, char * fnd)
{
    int i = 0,j = 0,sLen = 0, fLen = 0;
    if(str != NULL && fnd != NULL)
    {
        sLen = str_get_len(str);
        fLen = str_get_len(fnd);
        while(i < sLen)
        {
            if(str[i] == fnd[j])
            {
                while(j < fLen)
                {
                    if(str[i + j] != fnd[j])
                        break;
                    j++;
                }
                if(j == fLen)
                    break;
                else
                    j = 0;
            }
            i++;
        }
        if(i == sLen)
            i = 0;
        str += i;
    }
    return str;
}
 
char * str_ins(char * str, char * ins, int pos)
{
    int i = 0,n_chr =0,sLen = 0,iLen = 0;
    if(str != NULL && ins != NULL)
    {
        sLen = str_get_len(str);
        iLen = str_get_len(ins);
        if(pos < sLen)
        {
            n_chr = sLen - pos;
            str = (char *)realloc(str,(sLen += iLen));
            memcpy(&str[pos + iLen],&str[pos],n_chr);
            while(i < iLen)
            {
                str[pos + i] = ins[i];
                i++;
            }
            str[sLen] = '\0';
        }
    }
    return str;
}
Миниатюры
Указатели char* - конкатенация без <string.h>  
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
10.06.2011, 22:00  [ТС]     Указатели char* - конкатенация без <string.h> #15
Всё по порядку:

accept, разделять на строки не было времени, старался срочно успеть решить программу, потому задался целью найти и устранить ошибки )

уже когда вішел из дому, обнаружил отсутствие строки free(find); в конце.
добавил.

что касается алгоритма поиска.
изначально он был устроен иначе и работал.
тем не менее сбои были и без того.
это не из-за поиска.
добавил необходимые изменения, которые вчера почему-то спросонья стёр)))
опять же обнаружил уже уехав.

вот как выглядит поиск. тут уже кажется без ошибок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* StrStr(char*s, char*s1)
{
 char *copy_s, *copy_s1 = s1;
 while (*s)
  {
   copy_s = s;
   while(*s++ == *s1++)
    if (!s1) return copy_s;
   s1 = copy_s1;
  }
 return NULL;
}


На счёт трёх указателей, это хорошо подмечено) Можно обойтись и двумя в данном случае.

Да впринципе всё хорошо подмечено, глаз зоркий)))

Ну конечно getche().... даже не знаю что сказать.
Считывание должно быть посимвольным, для того чтобы длина строки могла не ограничиваться 128.
Важное условие.
А что мне в этом случае поможет лучше чем getche() не знаю. Может getc() лучше.. Я не знаю разницу между ними ещё...

Запутанные конструкции...мой метод. Лучше пока не придумал, да и не задавался целью. Опять же потому что эта часть кода срабатывала на ура без использования функции вставки. Поэтому не думал что это может вызвать сбой...

Не выделять память? Изменение то необходимо. А выделение памяти поставил на фонарь... Искал пути решения проблемы...и... Убираю...)

"потеря указателя из find происходит ещё на раннем этапе"
Стоп. А мне он необходим? Если это важно, расскажите поподробнее.. Я в работу указателей только начинаю вникать... Никак не могу разобраться. Со строками начал знакомится. С выделением памяти вообще не знаком. Просто знаю, что важно. Очень интересно разобраться.

Спасибо!

-=ЮрА=-

Сейчас буду разбирать и изучать. Отпишусь. Спасибо!
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.06.2011, 04:40     Указатели char* - конкатенация без <string.h> #16
Цитата Сообщение от x-positive
тут уже кажется без ошибок:
C
1
if (!s1)
Цитата Сообщение от x-positive
accept, разделять на строки не было времени
естественно, поэтому это и делается в самом начале
и имена переменных придумываются имеющие смысл, короткие, легко понимаемые
strcat() - string concatenation
strstr() - string in string

Цитата Сообщение от x-positive
потому задался целью найти и устранить ошибки
в чистом коде это не занимает много времени

Цитата Сообщение от x-positive
C
1
if (!s1) return copy_s;
опять в одну строку написал

Цитата Сообщение от x-positive
Можно обойтись и двумя в данном случае
двумя и индексом

Цитата Сообщение от x-positive
Может getc() лучше
getc() - для файлов, для stdin есть getchar() (она может быть сделана через getc(stdin))

Цитата Сообщение от x-positive
Запутанные конструкции...мой метод. Лучше пока не придумал, да и не задавался целью.
это метод новичков, который приводит к тому, что каждый раз приходится снова разбираться в программе

Цитата Сообщение от x-positive
Никак не могу разобраться.
надо читать про них

Цитата Сообщение от x-positive
С выделением памяти вообще не знаком.
надо читать про него

Цитата Сообщение от x-positive
Со строками начал знакомится.
string - это из C++
твой код - это C
C и C++ - разные языки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2011, 21:04     Указатели char* - конкатенация без <string.h>
Еще ссылки по теме:

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]) C++
C++ Добавить 3 переменные в массив char без использования библиотеки string
Перевод переменной из int в char и конкатенация строк C++

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

Или воспользуйтесь поиском по форуму:
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
11.06.2011, 21:04  [ТС]     Указатели char* - конкатенация без <string.h> #17
accept,

Цитата Сообщение от accept Посмотреть сообщение
тут уже кажется без ошибок: if (!s1)
а ошибка всё таки была...
правильно будет так:
C
1
if (!*s1)
Цитата Сообщение от accept Посмотреть сообщение
для stdin есть getchar()
Им я и воспользовался, спасибо за советы )

Цитата Сообщение от 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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define  MAX       128    //length of strings
#define  ENTER     '\x0a'
#define  ENDLINE   '\0'  
#define  MSGRESULT "\nРезультат:\n"
#define  MSGNOFIND "\aНе найдено строки s1 в строке s."
#define  MSGGETS   "Введите строку s, в которой следует найти подстроку s1:"
#define  MSGGETS1  "\nВведите s1, которую следует найти в строке s и выделить с обеих строн пробелами:"
 
char* StrStr(char*s, char*s1)
{
 char *copy_s;
 char *copy_s1 = s1;
 
 while (*s)
  {
   copy_s = s;
 
   while (*s++ == *s1++)
     if (!*s1)
       return copy_s;
 
   s1 = copy_s1;
  }
 
 return NULL;
}
 
char* StrIns(char*s,char*s1,char*p)
{
 int   i  = 0;
 int   n;
 char *pp = (char*)malloc(MAX);
 
 while(*p)
  {
   *pp++ = *p++; [111]
    i++;
  }
 *pp = ENDLINE;
 n=i;
 for (i; i; i--)
  {
   *pp --;
   *p  --;
  }
 
 while(*s1)
  {
   *p++ = *s1++;
   i++;
  }
 
 while(*pp)
  {
   *p++ = *pp++;
  }
 *p  = ENDLINE;
 for(i+=n;i;i--)
  *p --;
 
 //free(pp);
 return s;
}
 
main()
{
 char  s[MAX];
 char  s1[MAX];
 char* space=" ";
 char* find=(char*)malloc(MAX);
 char* msg=(char*)malloc(MAX);
 int   i=0;
 int   len_S1;
 
// prototipes:
 
 char* StrStr(char*,char*);
 char* StrIns(char*,char*,char*);
 
 CharToOem(MSGGETS,msg);
 puts(msg);
 do s[i]=getchar();
 while(s[i++]!=ENTER);
 s[i-1]=ENDLINE;
 
 i=0;
 
 CharToOem(MSGGETS1,msg);
 puts(msg);
 do s1[i]=getchar();
 while(s1[i++]!=ENTER);
 s1[i-1]=ENDLINE;
 len_S1=i-1;
 
 CharToOem(MSGRESULT,msg);
 puts(msg);
 
 if (find = StrStr(s,s1))
 {
  do
  {
    StrIns(s,space,find);
    for (i=0;i<len_S1+1;i++)
     find++;
    StrIns(s,space,find);
    find++;
  }
  while (find = StrStr(find,s1));
  puts(s);
 }
 else
  {
   CharToOem(MSGNOFIND,msg);
   puts(msg);
  }
 
 free(find);
 free(msg);
 getch();
 return 0;
}
ОШИБКА находится в строке 67
C
1
//free(pp);
Правда хоть я от неё и избавился, но ошибка в программе осталась. Хоть и работает она теперь безотказно. Ошибка в том, что я попросту закомментировал строку
C
1
free(pp);
которая и выдавала сбой всё время, чего делать естественно нельзя. Теперь ищу пути её вернуть туда снова, чтобы она не выбивала программу.

Цитата Сообщение от accept Посмотреть сообщение
надо читать про них
надо читать про него
я всё время читаю, как только обнаруживаю что-нибудь важное, чего я не знаю.
про динамическую память теперь читаю.

Цитата Сообщение от accept Посмотреть сообщение
string - это из C++
твой код - это C
C и C++ - разные языки
что они разные давно подметил)) только учу я в основном С ) и хоть я и программировал-то на С++ )) а уж программа-то получилась на С ) а под строками в данный момент я подразумевал массив символов ))

accept, огромное спасибо за краткий курс обучения) спасибо за помощь в выявлении ошибок, программа работает) сто из ста )) разберусь с последней ошибкой будет всё супер!

кстати, -=Юра=-, только начал тестирование, и столкнулся с проблемами. программа, к сожалению, иногда затирает строку повторением символа.
так и не закончил тестирования и разбираться с ней.
доработал свою раньше)
Yandex
Объявления
11.06.2011, 21:04     Указатели char* - конкатенация без <string.h>
Ответ Создать тему
Опции темы

Текущее время: 07:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru