Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Ryuk
179 / 177 / 56
Регистрация: 10.06.2011
Сообщений: 871
#1

Указатель на двумерный массив символов - C++

10.03.2014, 13:19. Просмотров 620. Ответов 8
Метки нет (Все метки)

Доброго времени суток.
Особо не сталкивался со строками, но сейчас возникла необходимость, так же возникли и проблемы.
Пытаюсь реализовать ввод строки(scanf) и ее вывод(printf).
Проблема в том, что при компиляции(MinGW), консоль начинает вести себя "неадекватно", выскакивает окошко(завершение программы).
http://www.cyberforum.ru/cpp-beginners/thread2180532.html
Реализацию через string не предлагать, прошу объяснить, что не так в данном коде.

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
#include <stdio.h>
 
void write_data(char **pas, int );
 
int main()
{
    int N = 1, K;
    char *passenger[N];
 
    /*scanf("%s", passenger[0]);
    printf("%s\n", passenger[0]);*/
    write_data(passenger, N);
 
    return 0;
}
 
void write_data(char **pas, int n)
{
    //for(int i = 0; i < n; i++)
    //{
        scanf("%s", *pas[0]);
        printf("%s\n", *pas[0]);
    //}
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2014, 13:19
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатель на двумерный массив символов (C++):

Указатель на двумерный массив
Как сделать то же самое с двумерным массивом? Как работать с двумерными или n-...

указатель на двумерный массив
Делая игру морской бой, я столкнулся с 1-ой проблемой: void place_ships(char...

Указатель на двумерный массив
хочу заменить вот такую запись: fs.read((char*)&amp;size_struct, sizeof(int));...

Указатель на двумерный массив
Допустим, у меня есть функция: void A(float **b) { b=1; } Тогда почему...

Указатель на двумерный массив
Здравствуйте. Подскажите пожалуйста, а существуют ли в C/C++ указатели: 1)...

8
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.03.2014, 13:56 #2
Цитата Сообщение от Ryuk Посмотреть сообщение
C++
1
char *passenger[N];
У тебя вот здесь определен массив указателей (char*) размерности N. Памяти под сами строки ты не выделял. Отсюда и поведение "неадекватное".

Добавлено через 4 минуты
Цитата Сообщение от Ryuk Посмотреть сообщение
C++
1
int N = 1
N - в подобном коде на С++ должна быть константой. (Да, gcc это собирает и для Си++, но легально это только для Си. Если же мы говорим о Си, тогда мы не том разделе).
0
Ryuk
179 / 177 / 56
Регистрация: 10.06.2011
Сообщений: 871
10.03.2014, 14:06  [ТС] #3
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
тогда мы не том разделе
В разделе по Си, ответ ждать долго, а т.к. большинство программистов знает вместе с Си С++, то тема в этом разделе.
Цитата Сообщение от DrOffset Посмотреть сообщение
но легально это только для Си
Покажите как надо, ведь я выделяю фактически указатель на указатель.

Что касается С++, то если мне нужно вводить размерность N(кол-во строк) и эта же N - константа, то вопрос решается только динамически?
0
Jupiter
10.03.2014, 14:09
  #4

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
но легально это только для Си
<= С99

0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.03.2014, 14:22 #5
Цитата Сообщение от Ryuk Посмотреть сообщение
вопрос решается только динамически?
Да. Тут важно понимать, что память под массив в твоем примере выдялется на стеке, а он далеко не бесконечный. Из этих соображений это запрещено в стандартном С++.

Цитата Сообщение от Ryuk Посмотреть сообщение
Покажите как надо
В самом простейшем варианте - так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
const int S = 256;
 
void write_data(char * pas);
 
int main()
{
    const int N = 1;
    char passenger[S][N];
 
    for(int i = 0; i < N; i++)
    {
        write_data(passenger[i]);
    }
    return 0;
}
 
void write_data(char * pas)
{
    scanf("%256s", pas); // ограничим максимальную длину, чтобы не было переполнения
    printf("%s\n", pas);
}
Добавлено через 5 минут

Не по теме:

Jupiter, да, спасибо, я в курсе.

1
Ryuk
179 / 177 / 56
Регистрация: 10.06.2011
Сообщений: 871
10.03.2014, 15:19  [ТС] #6
DrOffset, а если нам нужно вводить кол-во строк, тогда что?
0
DrOffset
7517 / 4513 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
10.03.2014, 15:29 #7
Ryuk, тогда динамическая память. В С++ для этого есть удобные классы. Если надо без них, или на С, то следить за памятью придется вручную.
0
Ryuk
179 / 177 / 56
Регистрация: 10.06.2011
Сообщений: 871
10.03.2014, 15:41  [ТС] #8
DrOffset, пример программы на Си можете привести(через динамику)?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.03.2014, 15:58 #9
Цитата Сообщение от Ryuk Посмотреть сообщение
пример
тут есть пример, адаптируй, тыжпрограммист
1
10.03.2014, 15:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2014, 15:58
Привет! Вот еще темы с решениями:

Указатель на двумерный массив
A эквивалентно *(*(A+i)+j). Просто давайте допустим, что у нас матрица A. Как...

Указатель на двумерный массив и выше
Всем привет!Сразу к делу. Я решил по лучше разобраться в указателях и...

Двумерный массив через указатель
как вывести двумерный массив через указатель? с одномерным понятно,а как так...

Указатель на двумерный массив указателей
char* err = {{&quot;abc&quot;}, {&quot;def&quot;}}; char ***ptr; ptr = (char ***)err;...


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

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

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