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

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

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

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

11.05.2013, 05:22. Просмотров 4367. Ответов 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) - как я понял берёт уже введённую строчку, а у меня после ввода колечества слов и нажатия на ентер выкидывает с ошибкой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2013, 05:22
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ввод строк и запись их в массив указателей (C++):

Запись вектора строк в массив указателей на тип char - C++
Решаю задачу 4.34 из книги Липпмана С. Язык программирования С++. Вводный курс. 4-е изд. Задание: 1) Напишите программу, читающую...

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Массив строк как массив указателей на массивы чаров - C++
Я всё правильно сделал? char* Files; Files = &quot;AHEAD&quot;; Files = &quot;LEFT&quot;; Files = &quot;RIGHT&quot;; Files = NULL; int searchFile()...

Запись и чтение массива указателей в двумерный массив - C++
Подскажите пожалуйста, вот у меня генерируется двумерный массив в массиве указателей (int**), как мне записать массив указателей в другой...

Сформировать массив указателей на матрицу строк - C++
может кто нибудь обьяснит что требуеться в задании сделать. сформировать массив указателейна масиив строк и заполнить циклически буквами...

Вектор строк и массив указателей на тип char - C++
Помогите, пожалуйста, с одной задачей. Сижу голову ломаю. Никак не могу понять почему эта ошибка выскакивает. Напишите программу,...

28
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 06:07 #2
Цитата Сообщение от Олексей Посмотреть сообщение
C++
1
char *s=new char [];
Это что такое?

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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Это что такое?
это динамический массив символов
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 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;
}
1
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:03  [ТС] #5
Спасибо, хоть где-то нашёлся нормальный пример, всё понял и понял в чём была ошибка, вот только не понял что вот это за стока:

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::cin.ignore(std::cin.rdbuf()->in_avail())
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:12 #6
Игнорируем символы, которые остались в потоке.
После ввода числа в потоке остается символ конца строки и при следующем чтении он считается первым и строчка окажется пустой.
Код
поток_ввода.игнорировать(поток_ввода.указатель_буфер_для_чтения()->количество_символов_в_потоке())
0
Олексей
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;
}
Может это и удивительно, но у меня и так работает ну я просто взял массив для слов динамический что бы не не выделять лишнюю память и не было переполнения в случае не пред усмотрения размера, оно как бы работает но что-то мне подсказывает что здесь что то не так.
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:31 #8
Цитата Сообщение от Олексей Посмотреть сообщение
Может это и удивительно, но у меня и так работает
а теперь попробуйте освободить память, которую выделяли:
C++
1
delete [] str;
Вообще, вы читаете туда - не знаю куда. И будет после этого то - не знаю что(UB)
1
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:35  [ТС] #9
Ну да ошибка, это из-за того что оно копирует только адреса на начало стоки из это области памяти? а потом я удаляю эту область и массиву что их содержал не на что ссылаться?
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 3
Завершенные тесты: 1
11.05.2013, 07:36 #10
Цитата Сообщение от Олексей Посмотреть сообщение
ну я просто взял массив для слов динамический
Нет в c++ динамических массивов. new char[] я так полагаю, что Вы в студии это компилируете, т.к. другие компиляторы врядли пропустят такое
0
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 07:37  [ТС] #11
Цитата Сообщение от Croessmah Посмотреть сообщение
я так полагаю, что Вы в студии это компилируетсе
Да компиляция в студии)
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 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.
1
Олексей
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;
}
Что не так?
я уже подключил все библиотеки, думал в этом ошибка , ничего не помогло
0
Croessmah
Ушел
13769 / 8019 / 924
Регистрация: 27.09.2012
Сообщений: 19,744
Записей в блоге: 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;
}
0
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 259
11.05.2013, 08:34  [ТС] #15
Почему gets() отказался работать? всё из-за эти пробелов в потоке?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 08:34
Привет! Вот еще темы с ответами:

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него - C++
Как правильно создать двумерный массив указателей с использованием calloc и ввести в него данные?

Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже --> - C++
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы...

создать статический массив строк как статический массив указателей на строки, задание ниже --> - C++
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова...

Ввод нескольких строк или массив строк - C++
У меня есть массив строк. Нужно ввести несколько строк, но не получается. Вот код: int main() { const int n=4; const int...


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

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

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