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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
#1

Ввод строк и запись их в массив указателей - C++

11.05.2013, 05:22. Просмотров 3311. Ответов 28
Метки нет (Все метки)

Мне надо считать определённое количество слов, это количество я должен ввести, потом каждое их эти слов записать в массив, как я понял это получится массив указателей , но проблема в том что длина каждой стоки у меня не определена и как считывать такое дело я не знаю, нашёл кучу функций для работы со строками но уже считанными. Вот что получилось пока.

C++
1
2
3
4
    int n;
    cin>>n;
    char **gruppa=new char*[n];
    char *s=new char [];
дальше как не пробовал или считывает до бесконечно или ошибку выдаёт, пробовал сделать циклом где условие считывать пока i < strlen(s); и если я даже считаю первую строчку как мне заставить его после нажатия на enter разрешить мне вводить ещё строчку опять её считывать. cin.getline(s,100) - как я понял берёт уже введённую строчку, а у меня после ввода колечества слов и нажатия на ентер выкидывает с ошибкой
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2013, 05:22     Ввод строк и запись их в массив указателей
Посмотрите здесь:
Запись вектора строк в массив указателей на тип char C++
C++ Массив указателей на массив строк и сортировка массива указателей
Массив строк как массив указателей на массивы чаров C++
Запись и чтение массива указателей в двумерный массив C++
C++ Сформировать массив указателей на матрицу строк
Вектор строк и массив указателей на тип char C++
Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 06:07     Ввод строк и запись их в массив указателей #2
Цитата Сообщение от Олексей Посмотреть сообщение
C++
1
char *s=new char [];
Это что такое?

А вообще, используйте std::string и большая часть проблем испарится.
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 06:37  [ТС]     Ввод строк и запись их в массив указателей #3
В том то и суть что надо сделать без типа данных string

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Это что такое?
это динамический массив символов
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 06:51     Ввод строк и запись их в массив указателей #4
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 <iostream>
#include <cstring>
 
int main(){
    char ** words;
    char temp_buffer[1024];
    unsigned int wordsCount;
    std::cout<<"Word count ->";
    std::cin>>wordsCount;
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    words=new char*[wordsCount];
    for(int i=0;i<wordsCount;++i){
        std::cout<<"Enter words["<<i<<"] ->";
        std::cin>>temp_buffer;
        words[i]=new char[strlen(temp_buffer)+1];
        strcpy(words[i],temp_buffer);
    }
    std::cout<<"Rezult:\n";
    for(int i=0; i<wordsCount;++i){
        std::cout<<words[i]<<" ";
    }
    std::cout<<std::endl;
}
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:03  [ТС]     Ввод строк и запись их в массив указателей #5
Спасибо, хоть где-то нашёлся нормальный пример, всё понял и понял в чём была ошибка, вот только не понял что вот это за стока:

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::cin.ignore(std::cin.rdbuf()->in_avail())
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:12     Ввод строк и запись их в массив указателей #6
Игнорируем символы, которые остались в потоке.
После ввода числа в потоке остается символ конца строки и при следующем чтении он считается первым и строчка окажется пустой.
Код
поток_ввода.игнорировать(поток_ввода.указатель_буфер_для_чтения()->количество_символов_в_потоке())
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:30  [ТС]     Ввод строк и запись их в массив указателей #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
#include<string.h>
 
using namespace std;
 
int main () {
    int n;
    char *str=new char [];
    cin>>n;
    char **gruppa=new char* [n];
 
    for(int i=0; i<n; i++){
    cin>>str;
    gruppa[i]=new char [strlen(str)+1];
    strcpy(gruppa[i], str);
    }
    for (int i=0; i<n; i++)
    cout<<gruppa[i]<<endl;
    return 0;
}
Может это и удивительно, но у меня и так работает ну я просто взял массив для слов динамический что бы не не выделять лишнюю память и не было переполнения в случае не пред усмотрения размера, оно как бы работает но что-то мне подсказывает что здесь что то не так.
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:31     Ввод строк и запись их в массив указателей #8
Цитата Сообщение от Олексей Посмотреть сообщение
Может это и удивительно, но у меня и так работает
а теперь попробуйте освободить память, которую выделяли:
C++
1
delete [] str;
Вообще, вы читаете туда - не знаю куда. И будет после этого то - не знаю что(UB)
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:35  [ТС]     Ввод строк и запись их в массив указателей #9
Ну да ошибка, это из-за того что оно копирует только адреса на начало стоки из это области памяти? а потом я удаляю эту область и массиву что их содержал не на что ссылаться?
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:36     Ввод строк и запись их в массив указателей #10
Цитата Сообщение от Олексей Посмотреть сообщение
ну я просто взял массив для слов динамический
Нет в c++ динамических массивов. new char[] я так полагаю, что Вы в студии это компилируете, т.к. другие компиляторы врядли пропустят такое
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:37  [ТС]     Ввод строк и запись их в массив указателей #11
Цитата Сообщение от Croessmah Посмотреть сообщение
я так полагаю, что Вы в студии это компилируетсе
Да компиляция в студии)
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:39     Ввод строк и запись их в массив указателей #12
http://msdn.microsoft.com/ru-ru/library/7wkxxx2e.aspx
The constant-expression must be of an integral type and must be greater than 0. A zero-sized array is legal only when the array is the last field in a struct or union and when the Microsoft extensions (/Ze) are enabled.
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 08:23  [ТС]     Ввод строк и запись их в массив указателей #13
Спасибо большое, я понял, зря пропустил пару пар по архитектуре компьютера)

Добавлено через 40 минут
У меня ещё вопрос, вот дальше после этого мне надо считать строку с пробелами , я хочу использовать функцию gets () оно не предлагает ввести строку , а просто выкидывает ошибку.

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
#include<iostream>
#include<string.h>
#include<cstring>
#include<cstdio>
 
using namespace std;
 
int main () {
    int n;
    char str[1024];
    char text[1024];
    cout<<"Vvedite kolishestvo studentov v gruppe: ";
    cin>>n;
    cin.ignore(std::cin.rdbuf()->in_avail());
    char **gruppa=new char* [n];
 
    for(int i=0; i<n; i++){
        cout<<i+1<<". ";
    cin>>str;
    gruppa[i]=new char [strlen(str)+1];
    strcpy(gruppa[i], str);
    }
    cout<<endl;
 
    gets(text);
    char *p;
    p=strtok(text," .?!");
    cout<<p;
 
    return 0;
}
Что не так?
я уже подключил все библиотеки, думал в этом ошибка , ничего не помогло
Croessmah
Модератор
Эксперт CЭксперт С++
13054 / 7317 / 815
Регистрация: 27.09.2012
Сообщений: 18,053
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 08:32     Ввод строк и запись их в массив указателей #14
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
int main () {
    int n;
    char str[1024];
    char text[1024];
    cout<<"Vvedite kolishestvo studentov v gruppe: ";
    cin>>n;
    cin.ignore(std::cin.rdbuf()->in_avail());
    char **gruppa=new char* [n];
 
    for(int i=0; i<n; i++){
        cout<<i+1<<". ";
    cin>>str;
    gruppa[i]=new char [strlen(str)+1];
    strcpy(gruppa[i], str);
    }
    cout<<endl;
     cin.ignore(std::cin.rdbuf()->in_avail());
    std::cin.getline(text,1024);
    char *p;
    p=strtok(text," .?!");
    cout<<p;
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 08:34     Ввод строк и запись их в массив указателей
Еще ссылки по теме:
C++ Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
C++ создать статический массив строк как статический массив указателей на строки, задание ниже -->
C++ Ввод нескольких строк или массив строк
C++ Cоздать и заполнить массив строк в стиле Си (квадратную матрицу указателей на char)
C++ Осуществить вывод строк из файла, используя массив указателей на эти строки

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

Или воспользуйтесь поиском по форуму:
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 08:34  [ТС]     Ввод строк и запись их в массив указателей #15
Почему gets() отказался работать? всё из-за эти пробелов в потоке?
Yandex
Объявления
11.05.2013, 08:34     Ввод строк и запись их в массив указателей
Ответ Создать тему
Опции темы

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