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

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

11.05.2013, 05:22. Показов 9948. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru