Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
1

Как создать динамический массив типа char, не запрашивая заранее его длину?

13.11.2013, 00:41. Просмотров 2054. Ответов 10
Метки нет (Все метки)

Например, пользователь должен ввести арифметическое выражение. Он не знает, сколько это будет символов. Как в таком случае задать динамический массив?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2013, 00:41
Ответы с готовыми решениями:

Как создать двухмерный динамический массив типа double
Погуглил, посмотрел на форуме, нашёл способ создания квадратной матрицы, а вот MxN не нашёл( ...

Посмотрите объявление вектора и попытайтесь создать динамический массив, содержащий элементы типа char
#include <iostream> #include <vector> using namespace std; int main() { vector<int> DynArrNums...

Как создать динамический массив типа string? Как создать класс такого массива?
Как создать динамический массив типа string? Как создать класс такого массива? =-O Помогите,...

Можно ли задать массив, не зная заранее его длину?
Доброе утро всем. Вчера начал читать "главу 4 Массивы". Там предложили 2 варианта объявления...

Динамические массивы. Дан массив записей из полей типа Char, Word, Byte. Преобразовать его в массив типа Longint
FreePascal Выполнить обработку массивов в соответствии с заданием. Предусмотреть описание...

10
IrineK
Заблокирован
13.11.2013, 03:15 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() 
{   char buf[256], *expression;
 
    fgets(buf, 255, stdin);     //считываем строку из потока в буфер
    buf[strlen(buf)-1] = '\0';  //убираем \n - если мешает
    
    expression = (char*) malloc(strlen(buf)+1); //запрашиваем память по фактической длине 
    strcpy(expression, buf);    //копируем
 
    printf("%s", expression);   //используем
    
    free(expression);
    getchar();
    return 0;
}
1
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
13.11.2013, 07:46  [ТС] 3
Цитата Сообщение от IrineK Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main() 
{   char buf[256], *expression;
 
    fgets(buf, 255, stdin);     //считываем строку из потока в буфер
    buf[strlen(buf)-1] = '\0';  //убираем \n - если мешает
    
    expression = (char*) malloc(strlen(buf)+1); //запрашиваем память по фактической длине 
    strcpy(expression, buf);    //копируем
 
    printf("%s", expression);   //используем
    
    free(expression);
    getchar();
    return 0;
}
Опять же ограничение 256 символов. Хочется без ограничений. Возможно так?
0
anmartex
...
1788 / 1256 / 931
Регистрация: 12.02.2013
Сообщений: 2,058
13.11.2013, 08:08 4
Цитата Сообщение от Sammi2186 Посмотреть сообщение
Опять же ограничение 256 символов. Хочется без ограничений. Возможно так?
Первое, что взбрело в голову:
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
#include <stdio.h>
#include <stdlib.h>
 
char* GetText(FILE* f)
{
    static unsigned length = 0;
    static char* ptr = NULL;
 
    char ch = fgetc(f);
 
    if ((ch == '\n') || (ch == EOF))
    {
        ptr = malloc(length + 1);
        ptr[length] = 0;
    }
    else
    {
        length++;
        GetText(f);
        ptr[--length] = ch;
    }
 
    return ptr;
}
 
int main()
{
    char* text = GetText(stdin);
 
    printf("[%s]", text);
 
    free(text);
 
    return 0;
}

Только не забывайте потом память очищать.
1
13.11.2013, 08:08
IrineK
Заблокирован
13.11.2013, 09:29 5
Цитата Сообщение от Sammi2186 Посмотреть сообщение
пользователь должен ввести арифметическое выражение
Цитата Сообщение от Sammi2186 Посмотреть сообщение
Хочется без ограничений
Арифметическое выражение в 256 символов - это я вам скажу, уже что-то монументальное.
А без ограничений парсить вообще будет весело )
0
Sammi2186
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 99
13.11.2013, 14:39  [ТС] 6
Цитата Сообщение от IrineK Посмотреть сообщение
Арифметическое выражение в 256 символов - это я вам скажу, уже что-то монументальное.
А без ограничений парсить вообще будет весело )
Конкретную задачу я для примера привел. Просто уже не раз сталкивался с подобным. Можно, конечно, сделать большой массив, но хочется поинтересней)
0
Байт
Эксперт C
21877 / 13643 / 2876
Регистрация: 24.12.2010
Сообщений: 29,026
13.11.2013, 22:17 7
Sammi2186, Есть еще такой подход. Аллокачиваете (malloc) массив какой-то приемлемой длины, скажем 80. Вводите в него посимвольно. Когда он заполняется, применяете realloc на удвоенный его размер. И так далее до посинения

Добавлено через 3 минуты
Цитата Сообщение от IrineK Посмотреть сообщение
Арифметическое выражение в 256 символов - это я вам скажу, уже что-то монументальное.
это не так. Да и не в арифметических выражениях тут дело. Надо признать такую простую вещь. что вводимые строки могут быть хз какой длины, и быть к этому готовым. В чистом Си таких функций, ИМХО, нет. Значит, надо их сделать самому.
1
IrineK
Заблокирован
14.11.2013, 04:49 8
Цитата Сообщение от Байт Посмотреть сообщение
И так далее до посинения
Байт, хорошо бы посмотреть на реализацию - не посинения, а идеи).
0
anmartex
...
1788 / 1256 / 931
Регистрация: 12.02.2013
Сообщений: 2,058
14.11.2013, 05:44 9
Цитата Сообщение от IrineK Посмотреть сообщение
Байт, хорошо бы посмотреть на реализацию - не посинения, а идеи).
Ну хотя бы так:
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
#include <stdio.h>
#include <stdlib.h>
 
char* GetText(FILE* f)
{
    const unsigned CBlock = 80;
    unsigned length = 0;
    char* text = malloc(CBlock);
    char ch;
 
    while (((ch = fgetc(f)) != '\n') && (ch != EOF))
    {
        text[length++] = ch;
 
        if (length % CBlock == 0)
        {
            text = realloc(text, length + CBlock);
        }
    }
    text[length] = 0;
 
    return text;
}
 
int main(int argc, char* argv[])
{
    char* text = GetText(stdin);
 
    printf("[%s]", text);
 
    free(text);
 
    return 0;
}
1
IrineK
Заблокирован
14.11.2013, 08:16 10
Ну, раз такой хэллоуворд, тогда:

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 256
 
char *GetLongLongLine(FILE *f)
{   int k = 0;
    char *buf = (char*) malloc(size);
    char *res = (char*) malloc(size);
 
    while(fgets (buf , size , f) != NULL)
    {   if(k > 0)
        {   k++;
            res = (char*) realloc(res, k*size);
            strcat(res, buf);
        }
        else
        {   k++;
            strcpy(res,buf);
        }
            
        if(strlen(buf) < size-1)
            break;
    }
    res[strlen(res)-1] = '\0';
    
    free(buf);
    return res;
}
 
int main()
{   char *myLongLine = GetLongLongLine(stdin);
    printf("\n%s", myLongLine);
 
    free(myLongLine);
    getchar();
    return 0;
}
Кто следующий? )
2
Байт
Эксперт C
21877 / 13643 / 2876
Регистрация: 24.12.2010
Сообщений: 29,026
14.11.2013, 10:31 11
anmartex, хорошо бы при конце файла NULL возвращать.
Цитата Сообщение от IrineK Посмотреть сообщение
хорошо бы посмотреть на реализацию
Добавлено через 1 минуту
Цитата Сообщение от IrineK Посмотреть сообщение
хорошо бы посмотреть на реализацию
Не вижу особого смысла. Все достаточно просто. Да и тема на форуме не раз обсуждалась
0
14.11.2013, 10:31
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.11.2013, 10:31

Двумерный динамический массив типа char
Как создать двумерный динамический массив типа char, в который будут записываться слова разной...

двумерный динамический массив типа char
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;windows.h&gt; using namespace std; void...

Трехмерный динамический массив типа char
Здравствуйте! Я хочу создать двухмерную матрицу, каждым элементом которой должна являться...


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

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

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