Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/140: Рейтинг темы: голосов - 140, средняя оценка - 4.87
 Аватар для Keks_Stolicny
9 / 8 / 4
Регистрация: 22.10.2017
Сообщений: 162

Динамический массив символов си

07.04.2018, 15:28. Показов 28232. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1)
C++
1
char *ans = (char*)malloc(sizeof(char)*max);
max = 2, а резервирует для 6 символов или больше

2) Можно ли в си вводить массив символов как string в с++, если дай, то как это сделать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2018, 15:28
Ответы с готовыми решениями:

Ввод символов (тип char) в динамический массив
Коллеги! Прошу помочь! Создаю символьный динамический массив (выделяю под него память). С клавиатуры задаю его размерность, а потом...

Сделать динамический массив структур, причем в структуре так же существует динамический массив
Добрый день. Есть такая пзадача: нужно сделать динамический массив структур, причем в структуре так же существует динамический массив....

Динамический массив символов
Что я делаю не так? вот код: header.h #include<iostream> #include<string.h> class m{public: m();~m(); void...

4
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,326
07.04.2018, 17:21
Лучший ответ Сообщение было отмечено Keks_Stolicny как решение

Решение

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>      //предоставляет: fgetc, stdin
#include <stdlib.h>     //sizeof, free, realloc, malloc
#include <string.h>     //strcmp, strncpy
 
/* ********************************************************************
 * Получает с клавиатуры количество строк > 0.
 * А затем и сами строки.
 * После чего выводит их на экран.
 * *******************************************************************/
typedef char* string;       // новый тип данных - строка
char * getstring (void);    // ввод строки с клавиатуры
 
int main (void)
{
    int n;
    do{ // ввод
        printf("Введите количество строк: ");
        scanf("%i", &n);
        while(getchar() != '\n');
    }while(n < 0);
 
    // обработка
    if(n > 0)
    {
        int i;
        string strings[n];      // массив строк
 
        for(i = 0; i < n; i++)
        {
            printf("%i-я строка: ", i+1);
            strings[i] = getstring();
        }
 
        // вывод
        printf("\n");
        printf("Вывод:\n");
        for(i = 0; i < n; i++)
            printf("%s\n", strings[i]);
        printf("\n");
    }
 
    return 0;
}
// ------------------- getstring --------------------------
char* getstring (void)
{
    char* buffer = NULL;                        //буфер для хранения символов
    unsigned int capacity = 0;              //размер буфера
    unsigned int n = 0;                     //сколько символов в буфере
    int bitofchar = sizeof(char);           //сколько бит в одном char
    int MAX_LEN = 2048;                     //1 строка максимум 4 Мб (MAX_LEN*2)
    int c;                                      //сюда записываем символы
 
    // получаем символы
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        if (n + 1 > capacity)               //проверяем размер буфера
        {
            if (!capacity) capacity = 32; //по умолчанию 32 символа
            else if (capacity <= MAX_LEN) capacity *= 2;
            else                                    //угроза переполнения буфера
            {
                free(buffer);
                return NULL;
            }
            // меняем размер буфера в памяти
            char* temp = (char*) realloc(buffer, capacity * bitofchar);
            if (!temp)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }
        // заносим символ в буфер
        buffer[n++] = c;
    }
    if (n == 0 && c == EOF) return NULL;//если пустая строка, вернем NULL
 
    // минимизируем размер буфера
    char* minimal = (char*) malloc((n + 1) * bitofchar);
    strncpy(minimal, buffer, n);
    free(buffer);                               //освобождаем память
    minimal[n] = '\0';                      //добавляем конец строки
 
    return minimal;                         //возвращаем получившуюся строку
}
Keks_Stolicny, использование malloc для с++ нетипично уже лет 10 - 15 как, сейчас принято использовать new.

malloc же скорее как раз ближе к чистому си.
1
 Аватар для Keks_Stolicny
9 / 8 / 4
Регистрация: 22.10.2017
Сообщений: 162
07.04.2018, 17:26  [ТС]
stake-k26, спасибо большое! Да, я знаю, у меня задание написать на чистом си
0
2493 / 1157 / 709
Регистрация: 25.04.2016
Сообщений: 3,326
07.04.2018, 17:43
Лучший ответ Сообщение было отмечено Keks_Stolicny как решение

Решение

В программе небольшой косяк - при выходе не освобождается память, занятая строками, из-за чего образуются утечки, вот исправленный вариант:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>      //предоставляет: fgetc, stdin
#include <stdlib.h>     //sizeof, free, realloc, malloc
#include <string.h>     //strcmp, strncpy
 
/* ********************************************************************
 * Получает с клавиатуры количество строк > 0.
 * А затем и сами строки.
 * После чего выводит их на экран.
 * *******************************************************************/
typedef char* string;       // новый тип данных - строка
char * getstring (void);    // ввод строки с клавиатуры
 
int main (void)
{
    int i, n;
    do{ // ввод
        printf("Введите количество строк: ");
        scanf("%i", &n);
        while(getchar() != '\n');
    }while(n < 0);
 
    // обработка
    if(n > 0)
    {
        string strings[n];      // массив строк
 
        for(i = 0; i < n; i++)
        {
            printf("%i-я строка: ", i+1);
            strings[i] = getstring();
        }
 
        // вывод
        printf("\n");
        printf("Вывод:\n");
        for(i = 0; i < n; i++)
            printf("%s\n", strings[i]);
        printf("\n");
 
        // освобождаем память
        for(i = 0; i < n; i++)
            free(strings[i]);
    }
 
    return 0;
}
// ------------------- getstring --------------------------
char* getstring (void)
{
    char* buffer = NULL;                        //буфер для хранения символов
    unsigned int capacity = 0;              //размер буфера
    unsigned int n = 0;                     //сколько символов в буфере
    int bitofchar = sizeof(char);           //сколько бит в одном char
    int MAX_LEN = 2048;                     //1 строка максимум 4 Мб (MAX_LEN*2)
    int c;                                      //сюда записываем символы
 
    // получаем символы
    while ((c = fgetc(stdin)) != '\n' && c != EOF)
    {
        if (n + 1 > capacity)               //проверяем размер буфера
        {
            if (!capacity) capacity = 32; //по умолчанию 32 символа
            else if (capacity <= MAX_LEN) capacity *= 2;
            else                                    //угроза переполнения буфера
            {
                free(buffer);
                return NULL;
            }
            // меняем размер буфера в памяти
            char* temp = (char*) realloc(buffer, capacity * bitofchar);
            if (!temp)
            {
                free(buffer);
                return NULL;
            }
            buffer = temp;
        }
        // заносим символ в буфер
        buffer[n++] = c;
    }
    if (n == 0 && c == EOF) return NULL;//если пустая строка, вернем NULL
 
    // минимизируем размер буфера
    char* minimal = (char*) malloc((n + 1) * bitofchar);
    strncpy(minimal, buffer, n);
    free(buffer);                               //освобождаем память
    minimal[n] = '\0';                      //добавляем конец строки
 
    return minimal;                         //возвращаем получившуюся строку
}
тест валгриндом проходит на ура.
1
 Аватар для Keks_Stolicny
9 / 8 / 4
Регистрация: 22.10.2017
Сообщений: 162
07.04.2018, 21:59  [ТС]
stake-k26, спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2018, 21:59
Помогаю со студенческими работами здесь

динамический массив символов..
Со слова яблоко путем &quot;вырезок&quot; и &quot;склейок&quot; его букв получить слова блок и глаз

Динамический массив символов
В функции по перестановке строк массива пытаюсь объявить новый одномерный массив с размером, который передается в функцию, но компиль...

Двумерный динамический массив символов
Одномерный массив создаётся, но когда пытаюсь сделать двумерный, то ошибка. Заранее спасибо. #pragma argsused #include...

Обработка массивов символов. Динамический массив
Дано предложение в виде статического массива, где слова разделены пробелом. Скопировать предложение в динамический массив и поменять...

Динамический массив символов. Обработка строки
Реализовать функцию,принимающую только один параметр - динамический массив-строку s и ничего не возвращающую. Функция должна меня строку s...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru