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

в функцию передается два строковых указателя - C++

Восстановить пароль Регистрация
 
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
18.10.2010, 21:18     в функцию передается два строковых указателя #1
Добрый день!

Функции передается два указателя на массив строк. Пользователь вводит строки, необходимо найти количество совпадений второго массива в первом, причем нужно записать указатели на совпадающие элементы в динамически созданный массив указателей.

Собственно, на массиве указателей я запутался окончательно.

Так же, мне не понятно как освободить память, если нужно вернуть указатель на динамически созданный массив? Может быть, память освободится при выходе из блока функции?

Если у Вас есть минутка, посмотрите, пожалуйста, код.

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
#include <iostream>
#include <string>
using namespace std;
 
char** sbp (char *A, char *B){
 
 
       int sizeA = 0;
       int sizeB = 0;
       int quant = 0;
       int count = 0;
       while (*A) {
 
               sizeA++;
               A++;
       }
       while (*B){
 
               sizeB++;
           B++;
       }
 
       char **p;
 
       p = new char *[sizeA];
 
       if (sizeA < sizeB){
 
               cout << "The second world bigger than sentance!" << endl;
               return 0;
       }else{
 
               A-=sizeA;
               B-=sizeB;
 
       while (*A){
 
               if (*A == *B) {
 
 
                       p = &A;
                       p++;
                       quant++;
                       count++;
                       cout << "At " << count <<" index!" << endl;
 
               }else{
 
                       count++;
                       cout << "No!"<< endl;
               }
 
               A++;
       }
       }
 
      /* if (quant < sizeA){
 
               while (quant < (sizeA - 1)){
 
                       quant++;
                       p[quant] = "/0";
               }
       }*/
 
       p-=(quant);
 
       for (int i = 0; i < quant; i ++){
       
           cout << **p << endl;
           p++;
           
       }
 
       
       return p;
       
}
 
int main(){
 
char s1[80], s2[80];
 
gets(s1);
gets(s2);
char **q;
 
q = sbp(s1,s2);
 
}
Логика в коде недоработана, основной вопрос - это работа с указателем на массив указателей!

Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
19.10.2010, 02:58     в функцию передается два строковых указателя #2
ты если память выделил, записал её адрес в указатель, не надо его двигать
лучше создай новый указатель и двигай его

C++
1
2
3
4
5
6
7
8
    p -= quant;
 
    for (int i = 0; i < quant; i ++) {
        cout << **p << endl;
        p++;
    }
 
    return p;
вот ошибка, ты его двигал-двигал и додвигал

создай char **q = p;

C++
1
2
    for (int i = 0; i < quant; i ++)
        cout << *p[i] << endl;
то же самое, только без движения
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
20.10.2010, 01:59  [ТС]     в функцию передается два строковых указателя #3
Спасибо за советы.

Один вопрос.

В больших программах, с выделением большого кол-ва памяти, наверное не стоит использовать char **q = p; или это вообще не влияет?

Добавлено через 2 часа 45 минут
Да, наверное не влияет, ведь указатель это просто адресс...
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.10.2010, 04:36     в функцию передается два строковых указателя #4
указатель на символ и указатель на структуру если не одного размера, то где-то около того (не знаю, могут ли разные указатели быть разных размеров)
вообще любой указатель можно записать в указатель на void, так что все указатели не больше sizeof(void *)
Don Vito
 Аватар для Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
20.10.2010, 21:05  [ТС]     в функцию передается два строковых указателя #5
Я понял тебя, спасибо за советы!))

Конечно, лучше не трогать указатель на выделенную память...

Знаешь, мне только одно не дает покой -

почему вот так вот код работает:
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
#include <iostream>
#include <string>
using namespace std;
 
char** sbp (char *A, char *B){
 
 
       int sizeA = 0;
       int sizeB = 0;
       int quant = 0;
       int count = 0;
       while (*A) {
 
               sizeA++;
               A++;
       }
       while (*B){
 
               sizeB++;
           B++;
       }
 
       char **p;
 
       p = new char *[sizeA];
 
       cout << p << endl;
 
       if (sizeA < sizeB){
 
               cout << "The second world bigger than sentance!" << endl;
               return 0;
       }else{
 
               A-=sizeA;
               B-=sizeB;
 
       while (*A){
 
               if (*A == *B) {
 
 
                       *p = A;
                       p++;
                       quant++;
                       count++;
                       cout << "At " << count <<" index!" << endl;
 
               }else{
 
                       count++;
                       cout << "No!"<< endl;
               }
 
               A++;
       }
       }
 
       cout << p << endl;
       cout << quant << "   "<< sizeA<< endl;
 
      
 
             /*  while (quant < sizeA  ){
 
               quant++;
                   cout << p << endl;
       p++;
               }*/
     
       cout << quant << "   "<< sizeA<< endl;
 
       p-=quant;
 
       cout << p << endl;
 
       for (int i = 0; i < quant; i ++){
       
           cout << *p << endl;
           p++;
               }
 
       p-=quant;
 
        cout << p << endl;
 
       return p;
       
}
 
int main(){
 
char s1[80], s2[80];
 
gets(s1);
gets(s2);
char **q;
 
q = sbp(s1,s2);
 
cout << *q << endl;
а вот так нет

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
#include <iostream>
#include <string>
using namespace std;
 
char** sbp (char *A, char *B){
 
 
       int sizeA = 0;
       int sizeB = 0;
       int quant = 0;
       int count = 0;
       while (*A) {
 
               sizeA++;
               A++;
       }
       while (*B){
 
               sizeB++;
           B++;
       }
 
       char **p;
 
       p = new char *[sizeA];
 
       cout << p << endl;
 
       if (sizeA < sizeB){
 
               cout << "The second world bigger than sentance!" << endl;
               return 0;
       }else{
 
               A-=sizeA;
               B-=sizeB;
 
       while (*A){
 
               if (*A == *B) {
 
 
                       *p = A;
                       p++;
                       quant++;
                       count++;
                       cout << "At " << count <<" index!" << endl;
 
               }else{
 
                       count++;
                       cout << "No!"<< endl;
               }
 
               A++;
       }
       }
 
       cout << p << endl;
       cout << quant << "   "<< sizeA<< endl;
 
      
 
               while (quant < sizeA  ){
 
                       quant++;
                                       cout << p << endl;
                       p++;
               }
     
       cout << quant << "   "<< sizeA<< endl;
 
       p-=quant;
 
       cout << p << endl;
 
       for (int i = 0; i < quant; i ++){
       
           cout << *p << endl;
           p++;
               }
 
       p-=quant;
 
        cout << p << endl;
 
       return p;
       
}
 
int main(){
 
char s1[80], s2[80];
 
gets(s1);
gets(s2);
char **q;
 
q = sbp(s1,s2);
 
cout << *q << endl;
 
}
Не могу понять, ведь если сдвинул указатель вперед на n и вернул назад на n должно ведь работать!

Добавлено через 6 минут
какой то касяк в этом цикле while
C++
1
2
3
4
5
6
  while (quant < sizeA  ){
 
                       quant++;
                       cout << p << endl;
              p++;
}
Добавлено через 1 час 28 минут
Вообщем я позаморачивался часок...

Указателю, наверное, не нравиться, что он не на что не указывает...

Вот так вот все работает

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
#include <iostream>
#include <string>
using namespace std;
 
char** sbp (char *A, char *B){
 
 
       int sizeA = 0;
       int sizeB = 0;
       int quant = 0;
       int count = 0;
       char *S  = "\0";
       while (*A) {
 
               sizeA++;
               A++;
       }
       while (*B){
 
               sizeB++;
           B++;
       }
 
       char **p;
 
       p = new char *[sizeA];
 
       if (sizeA < sizeB){
 
               cout << "The second world is bigger than sentance!" << endl;
               return 0;
       }else if ((sizeA == 0 || sizeB == 0) || (sizeA == 0)){
       
           cout << "You did not indicate latter!" << endl;
           return 0;
       
       }else{
 
               A-=sizeA;
               B-=sizeB;
 
       while (*A){
 
               if (*A == *B) {
 
 
                       *p = A;
                       p++;
                       quant++;
                       count++;
                       cout << "At " << count <<" index!" << endl;
 
               }else{
 
                       count++;
                       cout << "No!"<< endl;
               }
 
                       A++;
       }
    
 
              while (quant < sizeA  ){
                      
                       *p ="\0";
                       quant++;
                       p++;
 
               }
 
       p-=quant;
      
       return p;    
       }
}
 
int main(){
 
char s1[80], s2[80];
 
gets(s1);
gets(s2);
char **q;
 
q = sbp(s1,s2);
 
if (q){
 
while (**q){
 
    cout << q <<"   "<< **q++ << endl;
}
}
}
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.10.2010, 04:40     в функцию передается два строковых указателя #6
Цитата Сообщение от Don Vito
Указателю, наверное, не нравиться, что он не на что не указывает...
не, ему всё равно, пока его не разыменовываешь

(quant нужно было обнулять перед циклом)
Yandex
Объявления
21.10.2010, 04:40     в функцию передается два строковых указателя
Ответ Создать тему
Опции темы

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