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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
#1

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

18.10.2010, 21:18. Просмотров 376. Ответов 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
#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);
 
}
Логика в коде недоработана, основной вопрос - это работа с указателем на массив указателей!

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2010, 21:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос в функцию передается два строковых указателя (C++):

Можно ли объявить два указателя на одну функцию? - C++
есть функция Send(uint type, char*data); но иногда второй аргумент const char*. можно ли сделать так чтобы на одну функцию Send указывали...

Разыменование указателя, не передается правильное значение - C++
Здравствуйте, есть следующий код: for (int i = 0; i &lt; arr.size(); i++) { const char *temp = arr.c_str(); const char...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? - C++
Собсно. То есть ребята, вот пример отсюда: http://www.cplusplus.com/reference/algorithm/count_if/ // count_if example #include...

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Массив не передается в функцию - C++
Помогите, я понимаю, что ошибка очень тупая, но исправить не могу. Массив t не передается ни в функцию Linesearch, ни в функцию iDel....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4821 / 3241 / 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
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
20.10.2010, 01:59  [ТС] #3
Спасибо за советы.

Один вопрос.

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

Добавлено через 2 часа 45 минут
Да, наверное не влияет, ведь указатель это просто адресс...
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.10.2010, 04:36 #4
указатель на символ и указатель на структуру если не одного размера, то где-то около того (не знаю, могут ли разные указатели быть разных размеров)
вообще любой указатель можно записать в указатель на void, так что все указатели не больше sizeof(void *)
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
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.10.2010, 04:40 #6
Цитата Сообщение от Don Vito
Указателю, наверное, не нравиться, что он не на что не указывает...
не, ему всё равно, пока его не разыменовываешь

(quant нужно было обнулять перед циклом)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2010, 04:40
Привет! Вот еще темы с ответами:

Не передается массив в функцию - C++
Всем привет,не могу передать массив в функцию,после передачи массив получается пустой ILuaObject *args; args...

Неправильно передается массив в функцию - C++
Здравствуйте! Я решаю лабораторную работу и у меня возникли проблемы. Если не выносить подзадачи в функции, то программа работает...

в функцию передается параметр const int * - C++
В функцию передается параметр const int *. Для чего этот const: для указателя или для значения по указателю? И как сделать, чтобы в функции...

Зачем в функцию main передается void? - C++
Учительница рассказывала как сделать ​​программу калькулятор на сложение #include&lt;iostream.h&gt; int main(void) { int x, y; cin &gt;&gt;...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.10.2010, 04:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru