Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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....

5
accept
4825 / 3246 / 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;
то же самое, только без движения
1
Don Vito
9 / 9 / 1
Регистрация: 22.11.2009
Сообщений: 162
20.10.2010, 01:59  [ТС] #3
Спасибо за советы.

Один вопрос.

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

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

(quant нужно было обнулять перед циклом)
0
21.10.2010, 04:40
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;...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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