Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/46: Рейтинг темы: голосов - 46, средняя оценка - 4.78
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260

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

11.05.2013, 05:22. Показов 9837. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.05.2013, 05:22
Ответы с готовыми решениями:

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

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

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

28
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 06:07
Цитата Сообщение от Олексей Посмотреть сообщение
C++
1
char *s=new char [];
Это что такое?

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

Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
Это что такое?
это динамический массив символов
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 06:51
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 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 07:03  [ТС]
Спасибо, хоть где-то нашёлся нормальный пример, всё понял и понял в чём была ошибка, вот только не понял что вот это за стока:

Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
std::cin.ignore(std::cin.rdbuf()->in_avail())
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 07:12
Игнорируем символы, которые остались в потоке.
После ввода числа в потоке остается символ конца строки и при следующем чтении он считается первым и строчка окажется пустой.
Code
1
поток_ввода.игнорировать(поток_ввода.указатель_буфер_для_чтения()->количество_символов_в_потоке())
0
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 07:30  [ТС]
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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 07:31
Цитата Сообщение от Олексей Посмотреть сообщение
Может это и удивительно, но у меня и так работает
а теперь попробуйте освободить память, которую выделяли:
C++
1
delete [] str;
Вообще, вы читаете туда - не знаю куда. И будет после этого то - не знаю что(UB)
1
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 07:35  [ТС]
Ну да ошибка, это из-за того что оно копирует только адреса на начало стоки из это области памяти? а потом я удаляю эту область и массиву что их содержал не на что ссылаться?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 07:36
Цитата Сообщение от Олексей Посмотреть сообщение
ну я просто взял массив для слов динамический
Нет в c++ динамических массивов. new char[] я так полагаю, что Вы в студии это компилируете, т.к. другие компиляторы врядли пропустят такое
0
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 07:37  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
я так полагаю, что Вы в студии это компилируетсе
Да компиляция в студии)
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 07:39
http://msdn.microsoft.com/ru-r... xxx2e.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 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 08:23  [ТС]
Спасибо большое, я понял, зря пропустил пару пар по архитектуре компьютера)

Добавлено через 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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 08:32
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 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 08:34  [ТС]
Почему gets() отказался работать? всё из-за эти пробелов в потоке?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 08:36
Хотите gets поставьте
Просто не хорошо мешать ввод/вывод C и C++
1
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 08:44  [ТС]
Спасибо, вот и я так думаю, но учебник шилда по с++ рассказывает что мне надо использовать gets() , в общем не столь важно, ещё вопрос, можно ли каким то ещё способом игнорировать то тот самый символ конца строки?
и ещё как я понял в типе данных string нету того самого символа конца строки что не вызывает таких проблем с повторным считыванием так? просто я прочитал что тип данных стринг как бы есть и как бы хорош но для пользования чем то опасен и мол лучше по страинке
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 09:44
Цитата Сообщение от Олексей Посмотреть сообщение
как бы хорош но для пользования чем то опасен и мол лучше по страинке
Как раз таки наоборот

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

Цитата Сообщение от Олексей Посмотреть сообщение
и ещё как я понял в типе данных string нету того самого символа конца строки что не вызывает таких проблем
Под символом конца строки я имел ввиду '\n', а не нуль-терминатор '\0'
0
5 / 4 / 1
Регистрация: 05.04.2010
Сообщений: 260
11.05.2013, 14:41  [ТС]
Вот ещё вопрос, просто что бы не создавать новую тему. Цикл почему то не завершается
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);
        }
    }
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
11.05.2013, 15:47
C++
1
p=strstr(p+1,d);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.05.2013, 15:47
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru