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

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

Войти
Регистрация
Восстановить пароль
 
dani1evich
1 / 1 / 1
Регистрация: 26.09.2016
Сообщений: 19
#1

Передача массива из функции - C++

21.12.2016, 23:34. Просмотров 392. Ответов 10
Метки нет (Все метки)

Всем привет! Только начал изучать С++ и вот столкнулся с проблемой, как вывести массив символов из функции через return. В коде я вывожу его сиаутом, он это уже от безысходности)..представляю, что нужно передать указатель на первый элемент, но что то не могу реализовать.. Вот собственно в функции remove и не могу сделать. подскажите пожалуйста.
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
#include <iostream>
#include <conio.h>
#include <cstring>
 
using namespace std;
char str[256];
bool input();
bool checkbrackets(); 
char remove(); 
char symbol(); 
 
int main()
{
        while (input()) 
        system("cls");
 
    if (checkbrackets() == true)
             remove();
    else cout << endl << "\tCheck out breakets!";
 
    symbol();
    _getch();
    return 0;
char remove() 
{   
        int op(0), cl(0), j(0);
        for (int i(0); str[i] != '\0'; i++)
        {
            if (str[i] == '(')
            {
                op++; str[j++] = str[i];
            }
            if (str[i] == ')')
            {
                cl++; str[j++] = str[i];
            }
            if (op == cl && str[i] != ')')
                str[j++] = str[i];
        }
        str[j] = '\0';
        for (int i(0); str[i] != '\0'; i++)
            cout << str[i];
}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2016, 23:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача массива из функции (C++):

Передача массива функции - C++
Привет. Хочу передать функции массив в качестве аргумента но не знаю как это сделать. Какой есть способ? Код: void randoming(int...

Передача динамического массива в функции - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; /*const*/ int k=3; //void sum (int mas); void sum (int * arr, int...

Передача массива Функции, ошибка - C++
VS 2010 ругаеться ( Код из книги Дейтлов Что не так ? Как можно по другому подскажите пожалуйста #include &lt;iostream&gt; #include...

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

Передача двумерного массива в функции - C++
Мне нужно передать массив в функцию, а затем из этой функции в другую функцию. Вот код: #define _CRT_SECURE_NO_WARNINGS #define...

Передача двумерного массива в функции - C++
Здравствуйте. В c++ недавно. Компилятор ругается. Как правильно передать двумерный массив в функции? И вообще, какие замечания по коду? ...

10
ящюр
97 / 97 / 24
Регистрация: 15.03.2013
Сообщений: 521
Записей в блоге: 1
22.12.2016, 00:18 #2
C++
1
2
3
4
char* syml () {
   char * sd =new char[256];
   return sd; // Функция возвращает указатель на динамически созданный массив элементов char
}
Далее в коде принимаете этот указатель ну и.....что пожелаете.

Добавлено через 2 минуты
В коде это может выглядеть так
C++
1
2
3
int main() {
char ch* = syml();
}
Упрощенно конечно. В итоге, указатель ch будет содержать значение, возвращенное функцией.

Добавлено через 2 минуты
Дык у вас массив глобальный. Зачем вам возвращать указатель на него из функции? Вывод на экран можете тем же cout'ом и выводить.

Добавлено через 3 минуты
А где функции input(), checkbrackets() и symbol()?
1
dani1evich
1 / 1 / 1
Регистрация: 26.09.2016
Сообщений: 19
22.12.2016, 00:23  [ТС] #3
вот полный код проги..
а почему могу сиаутом? разме так можно?
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 <conio.h>
#include <cstring>
 
using namespace std;
char str[256]; 
bool input();
bool checkbrackets(); 
char remove(); 
char symbol(); 
 
int main()
{
        while (input())
        system("cls");
 
    if (checkbrackets() == true)
             remove();
    else cout << endl << "\tCheck out breakets!";
 
    symbol();
    _getch();
    return 0;
}
bool input()
{
    cout << "Input string text: ";
    cin.getline(str, 256); 
    for (int i(0); str[i] != '\0'; i++)
    {
        if (!isalpha(str[i]))
            return false;
    }
}
bool checkbrackets()
{
    int n(0);
    for (int i(0); str[i] != '\0'; i++) 
    {
        if (str[i] == ')') n--; 
        if (str[i] == '(') n++; 
        if (n < 0) break;
    }
    if (n == 0)
}
char symbol()
{
    cout << "\n\n";
    char *a = strchr(str, '+'); 
    if (a == '\0') cout << "Symbol + not faund: 0" << endl;
    else cout << "index symbol +: " << (a - str) << endl; 
 
    char *b = strchr(str, '*');
    if (b == '\0') cout << "Symbol * not faund: 0" << endl;
    else cout << "index symbol *: " << (b - str) << endl;
 
    char *c = strchr(str, '/');
    if (c == '\0') cout << "Symbol / not faund: 0" << endl;
    else cout << "index symbol /: " << (c - str) << endl;
 
    char *d = strchr(str, '-');
    if (d == '\0') cout << "Symbol - not faund: 0" << endl;
    else cout << "index symbol -: " << (d - str) << endl;
 
    char *e = strchr(str, '%');
    if (e == '\0') cout << "Symbol % not faund: 0" << endl;
    else cout << "index symbol %: " << (e - str) << endl;
 
    return 0;
}
char remove()
{   
        int op(0), cl(0), j(0);
        for (int i(0); str[i] != '\0'; i++)
        {
            if (str[i] == '(')
            {
                op++; str[j++] = str[i];
            }
            if (str[i] == ')')
            {
                cl++; str[j++] = str[i];
            }
            if (op == cl && str[i] != ')')
                str[j++] = str[i];
        }
        str[j] = '\0';
        for (int i(0); str[i] != '\0'; i++)
            cout << str[i];
}
0
ящюр
97 / 97 / 24
Регистрация: 15.03.2013
Сообщений: 521
Записей в блоге: 1
22.12.2016, 07:27 #4
Цитата Сообщение от dani1evich Посмотреть сообщение
а почему могу сиаутом? разме так можно?
Может я не правильно понял, Вы куда хотите выводить массив, на экран?
Если да, то почему нет?
Если бы у Вас массив был объявлен в main'не, то в этом бы случае он не был бы виден в функции, и тогда бы имело смысл передавать его в качестве аргумента в функцию и возвращать.

Добавлено через 11 минут
Что должна делать программа?
Позицию первого символа вроде ищет. Текст в скобках удаляет, при непарных скобках выводит сообщение.
1
dani1evich
1 / 1 / 1
Регистрация: 26.09.2016
Сообщений: 19
22.12.2016, 14:48  [ТС] #5
Да, именно это и делает.

Да, хочу вывести на экран результирующую строку..
Просто мне кажется в функции должна быть только логика, а вывод уже осуществлять непосредственно в main-e
Ну а вообще да, Вы правы, он глобальный и можно в принципе так и вывести.. но хотелось бы разобраться как передавать массив через return)
0
ящюр
97 / 97 / 24
Регистрация: 15.03.2013
Сообщений: 521
Записей в блоге: 1
22.12.2016, 15:04 #6
Массивы в функцию передаются всегда по ссылке. Если это статический массив, то можно передать так
C++
1
2
3
void rf(int arr[]){
    arr[0] = 3;
}
Нашел еще вот такой синтаксис и как утверждают это правильный. Я использовал первый вариант всегда.
C++
1
2
3
4
void redef(int (&arr)[3]){
    arr[1] = 5;
 
}
Возвращать такой массив не нужно т.к. вы работаете с ним на прямую.
вот вам простой пример
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <conio.h>
#include <cstring>
 
using namespace std;
void rf(int arr[]){
    arr[0] = 3;
}
void redef(int (&arr)[3]){
    arr[1] = 5;
 
}
int main()
{
    setlocale(LC_ALL, "Russian");
    int ad[3] = { 0 }; // Все элементы массива равны 0
    rf(ad);
    redef(ad);
    cout << ad[0] <<" " << ad[1] << endl;
    system("pause");
    return 0;
}
1
nd2
2388 / 1977 / 694
Регистрация: 29.01.2016
Сообщений: 6,432
22.12.2016, 15:15 #7
Цитата Сообщение от dani1evich Посмотреть сообщение
но хотелось бы разобраться как передавать массив через return)
Массив в функции не передаётся, передаётся указатель на начало массива, поэтому через return, в данном случае, ничего возвращать не нужно, достаточно передать указатель на начало:
Цитата Сообщение от dani1evich Посмотреть сообщение
Вот собственно в функции remove и не могу сделать
C++
1
2
3
char remove(char str[]);
//...
remove(str);
Добавлено через 3 минуты
Цитата Сообщение от ящюр Посмотреть сообщение
Массивы в функцию передаются всегда по ссылке.
Не всегда.
Цитата Сообщение от ящюр Посмотреть сообщение
Нашел еще вот такой синтаксис и как утверждают это правильный.
Это, как раз, по ссылке.
Цитата Сообщение от ящюр Посмотреть сообщение
Если это статический массив, то можно передать так
Это, как раз, передаётся указатель на начало.
2
ящюр
97 / 97 / 24
Регистрация: 15.03.2013
Сообщений: 521
Записей в блоге: 1
22.12.2016, 15:21 #8
Цитата Сообщение от nd2 Посмотреть сообщение
Не всегда.
Можно пример.
0
nd2
2388 / 1977 / 694
Регистрация: 29.01.2016
Сообщений: 6,432
22.12.2016, 15:25 #9
Цитата Сообщение от ящюр Посмотреть сообщение
Можно пример.
Ссылку с указателем на начало массива не путай. Сам пример привёл:
Цитата Сообщение от ящюр Посмотреть сообщение
C++
1
2
void rf(int arr[])
{ arr[0] = 3; }
Всё равно, что:
C++
1
2
void rf(int* arr)
{ arr[0] = 3; }
Ещё можно передать указатель на массив:
C++
1
2
3
4
void redef(int (*arr)[3])
{
    *arr[1] = 5;
}
1
ящюр
97 / 97 / 24
Регистрация: 15.03.2013
Сообщений: 521
Записей в блоге: 1
22.12.2016, 15:28 #10
))) Адрес и ссылка это понятно. Простите, я имел ввиду , что при передаче в функцию массив не копируется.
0
nd2
2388 / 1977 / 694
Регистрация: 29.01.2016
Сообщений: 6,432
22.12.2016, 15:37 #11
Цитата Сообщение от ящюр Посмотреть сообщение
я имел ввиду , что при передаче в функцию массив не копируется.
Это, да. Но передача массива по указателю на начало, по ссылке на массив, по указателю на массив - это разное.

Добавлено через 1 минуту
По-моему, это от Си: адреса ссылками называть?
0
22.12.2016, 15:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2016, 15:37
Привет! Вот еще темы с ответами:

Передача массива объектов функции - C++
Выбивает о каком-то недопустимом внешнем символе, подскажите что не так. Вот цикл, который прогоняет массив. user = new Students; ...

Передача массива вызывающей функции - C++
Как можно передать массив целиком в вызывающую функцию? И можно ли сделать так: есть целочисленный массив,в котором находится N...

Передача двухмерного массива функции - C++
Подскажите пожалуйста как передать статический массив array в функцию fn(), т.е. #include &lt;iostream&gt; using namespace std; void...

Передача массива структур в функции - C++
Написал лабораторную работу, программа свои функции выполняет, но мне кажется, что можно что-то наколдовать с памятью. Подскажите, как...


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

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

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