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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 05:22     Ввод строк и запись их в массив указателей #1
Мне надо считать определённое количество слов, это количество я должен ввести, потом каждое их эти слов записать в массив, как я понял это получится массив указателей , но проблема в том что длина каждой стоки у меня не определена и как считывать такое дело я не знаю, нашёл кучу функций для работы со строками но уже считанными. Вот что получилось пока.

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     Ввод строк и запись их в массив указателей
Посмотрите здесь:

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него C++
C++ Нужно создать статический массив строк как статический массив указателей на строки. Условние ниже -->
C++ сформировать массив указателей[10]на масиив строк [5][25]
Вектор строк и массив указателей на тип char C++
C++ Ввод нескольких строк или массив строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 06:07     Ввод строк и запись их в массив указателей #2
Цитата Сообщение от Олексей Посмотреть сообщение
C++
1
char *s=new char [];
Это что такое?

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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Это что такое?
это динамический массив символов
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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
Сообщений: 248
11.05.2013, 07:03  [ТС]     Ввод строк и запись их в массив указателей #5
Спасибо, хоть где-то нашёлся нормальный пример, всё понял и понял в чём была ошибка, вот только не понял что вот это за стока:

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::cin.ignore(std::cin.rdbuf()->in_avail())
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 07:12     Ввод строк и запись их в массив указателей #6
Игнорируем символы, которые остались в потоке.
После ввода числа в потоке остается символ конца строки и при следующем чтении он считается первым и строчка окажется пустой.
Код
поток_ввода.игнорировать(поток_ввода.указатель_буфер_для_чтения()->количество_символов_в_потоке())
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 07:31     Ввод строк и запись их в массив указателей #8
Цитата Сообщение от Олексей Посмотреть сообщение
Может это и удивительно, но у меня и так работает
а теперь попробуйте освободить память, которую выделяли:
C++
1
delete [] str;
Вообще, вы читаете туда - не знаю куда. И будет после этого то - не знаю что(UB)
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 07:35  [ТС]     Ввод строк и запись их в массив указателей #9
Ну да ошибка, это из-за того что оно копирует только адреса на начало стоки из это области памяти? а потом я удаляю эту область и массиву что их содержал не на что ссылаться?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 07:36     Ввод строк и запись их в массив указателей #10
Цитата Сообщение от Олексей Посмотреть сообщение
ну я просто взял массив для слов динамический
Нет в c++ динамических массивов. new char[] я так полагаю, что Вы в студии это компилируете, т.к. другие компиляторы врядли пропустят такое
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 07:37  [ТС]     Ввод строк и запись их в массив указателей #11
Цитата Сообщение от Croessmah Посмотреть сообщение
я так полагаю, что Вы в студии это компилируетсе
Да компиляция в студии)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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
Сообщений: 248
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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;
}
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 08:34  [ТС]     Ввод строк и запись их в массив указателей #15
Почему gets() отказался работать? всё из-за эти пробелов в потоке?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 08:36     Ввод строк и запись их в массив указателей #16
Хотите gets поставьте
Просто не хорошо мешать ввод/вывод C и C++
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 08:44  [ТС]     Ввод строк и запись их в массив указателей #17
Спасибо, вот и я так думаю, но учебник шилда по с++ рассказывает что мне надо использовать gets() , в общем не столь важно, ещё вопрос, можно ли каким то ещё способом игнорировать то тот самый символ конца строки?
и ещё как я понял в типе данных string нету того самого символа конца строки что не вызывает таких проблем с повторным считыванием так? просто я прочитал что тип данных стринг как бы есть и как бы хорош но для пользования чем то опасен и мол лучше по страинке
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 09:44     Ввод строк и запись их в массив указателей #18
Цитата Сообщение от Олексей Посмотреть сообщение
как бы хорош но для пользования чем то опасен и мол лучше по страинке
Как раз таки наоборот

Цитата Сообщение от Олексей Посмотреть сообщение
каким то ещё способом игнорировать то тот самый символ конца строки?
считывать cin.get'ом весь мусор

Цитата Сообщение от Олексей Посмотреть сообщение
и ещё как я понял в типе данных string нету того самого символа конца строки что не вызывает таких проблем
Под символом конца строки я имел ввиду '\n', а не нуль-терминатор '\0'
Олексей
5 / 4 / 0
Регистрация: 05.04.2010
Сообщений: 248
11.05.2013, 14:41  [ТС]     Ввод строк и запись их в массив указателей #19
Вот ещё вопрос, просто что бы не создавать новую тему. Цикл почему то не завершается
C++
1
2
3
4
5
6
7
8
9
10
11
char *d, *d2;
 
    for (int i=0; i<n; i++){
        d=gruppa[i]+1;
        char *p=strstr(text, d);
        while(p!=NULL){
            d2=p-1;
        *d2=*d2-'а'+'А';
        p=strstr(p, d);
        }
    }
а если так то работает, только делает не совсем то что надо.

C++
1
2
3
4
5
6
7
8
9
10
char *d;
 
    for (int i=0; i<n; i++){
        d=gruppa[i]+1;
        char *p=strstr(text, d);
        while(p!=NULL){
        *p=*p-'а'+'А';
        p=strstr(p, d);
        }
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 15:47     Ввод строк и запись их в массив указателей
Еще ссылки по теме:

Массив строк как массив указателей на массивы чаров C++
C++ создать статический массив строк как статический массив указателей на строки, задание ниже -->
Запись вектора строк в массив указателей на тип char C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
11.05.2013, 15:47     Ввод строк и запись их в массив указателей #20
C++
1
p=strstr(p+1,d);
Yandex
Объявления
11.05.2013, 15:47     Ввод строк и запись их в массив указателей
Ответ Создать тему
Опции темы

Текущее время: 02:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru