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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 81, средняя оценка - 4.65
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
#1

Чтение строки неизвестной длины - C++

23.11.2011, 14:40. Просмотров 11399. Ответов 42
Метки нет (Все метки)

реализация на СИ

как прочитать строку неизвестной длины? Чтение должно быть не посимвольным. Строка вводиться вручную.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2011, 14:40     Чтение строки неизвестной длины
Посмотрите здесь:

Чтение из файла с пропуском комментария неизвестной длины - C++
Всем привет. Подскажите, пожалуйста, можно ли как-то при чтении файла пропустить комментарий неизвестной длины и считать только числа? ...

Чтение из файла строки неизвестной длинны - C++
Здравствуйте. Стоит задача писать в файл строку неизвестной длинны, введенную с клавиатуры. А потом считать её из файла. Строку читаю...

Массив символов неизвестной длины - C++
Добрый утро/день/вечер. Дело такое: вводится строка состоящая из слов и чисел(целых), разделяют все это безобразие разнообразные символы:...

Ввод массива неизвестной длины - C++
Добрый день! Уважаемые знатоки, вопрос скорее всего тривиальный, но тем не менее решения у меня нет. Нужно задать вектор через пробелы...

Чтение строки неограниченной длины и её параллельная обработка - C++
Здравствуйте. В ходе реализации алгоритма для поиска возникла проблема в том, что в условии написано, что входная строка может быть сколь...

Ввод массива заранее неизвестной длины - C++
#include <iostream> using namespace std; int main () { int n; // ввод неизвестного массива int*mass = new int ; for (int i...

Ввод массива заранее неизвестной длины - C++
#include <iostream> #include <math.h> using namespace std; int main() { int arr, a = 0; cout << "Вводите...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 18:23     Чтение строки неизвестной длины #31
кто то забыл
C
1
 ++i
сделать

Хотя можно и без i
C
1
if ((sLen / 1024)==0)...
Пожалуй этот вариант будет лучше варианта с fgets где приходится использовать поиск в строке
-=ЮрА=-
23.11.2011, 18:25
  #32

Не по теме:

voral, я лишь показал что можно спокойно обойтись без fgets - далее как говориться дело техники...

Сыроежка
Заблокирован
23.11.2011, 18:31     Чтение строки неизвестной длины #33
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Siend, чтобы Вам было меньше возни, вот вам код аналогичный функционалу
даже лучше(т.к аллокаем через каждые 1024 символов)
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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    long i = 0, sLen = 0;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ äëèГ*Г*Гі ñòðîêè
    //ГЌГ*Г·Г*ëüГ*îå âûäåëåГ*ГЁГҐ ГЇГ*ìÿòè ГўГ±ГҐГЈГ® ïîä 1 ñèìâîë
    char ch, * str = (char *)malloc(1024*sizeof(char));
    printf("Enter string :\n");
    while((ch = getchar()) != '\n')
    {
        str[sLen] = ch;
        if(i < 1024)
            sLen++;
        else
        {
            str = (char *)realloc(str,(1 + (sLen += 1024))*sizeof(char));
            i = 0;
        }
    }
    str[sLen] = '\0';
    printf("Your input : \n");
    printf("%s\n",str);
    system("pause");//Ñòîï-òî÷êГ* ГЁГ*Г*Г·ГҐ ïðèëîæåГ*ГЁГҐ îòðГ*áîòГ*Гў Г±Г°Г*çó Г§Г*êðîåòñÿ
    return 0;
}
Я думаю, что в этом коде имеется логическая ошибка

C++
1
2
3
                str[sLen] = ch;
                if(i < 1024)
                        sLen++;
То есть если sLen == 1023, то на следующей итерации делается попытка записать значение в str[1024] Это конечно при условии, если бы переменная i изменялась. Но я не вижу, где она изменяется, поэтому в любом случае будет переполнение строки, если естестенно входная строка достаточно большая.
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 18:39     Чтение строки неизвестной длины #34
Может так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
        const int bufSize = 10;
        long sLen = 0;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc(bufSize*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                str[sLen] = ch;
                                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}
Добавлено через 2 минуты
Упс точно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
        const int bufSize = 10;
        long sLen = -1;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc(bufSize*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
                str[sLen] = ch;
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}
Добавлено через 1 минуту
bufSize конечно же лучше поставить больше 10
-=ЮрА=-
23.11.2011, 18:39
  #35

Не по теме:

Сыроежка, ну что мне тут вам доказывать, я накидал чтобы был понятен принцип, мне есть чем заняться и расстрачивать своё время не имею ни малейшего желания. Технические огрехи устранимы - важен принцип - аллокнули 1024, пока не заполнили их не аллокаем, заполнили добавили 1024 и всё...
PS:Я вас не трогаю вы сами лезете со своим я и оскорблениями именно в мой адрес(утверждайтесь например в помощи ТС-ам а не разборках)...

voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 18:42     Чтение строки неизвестной длины #36
черт - не углядел при аллоке надо учесть что будет еще '\0' ну и если сразу нажмут ентер предусмотреть чтоб не в str[-1] отправляался ноль
Сыроежка
Заблокирован
23.11.2011, 18:43     Чтение строки неизвестной длины #37
Цитата Сообщение от voral Посмотреть сообщение
Может так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
        const int bufSize = 10;
        long sLen = 0;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc(bufSize*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                str[sLen] = ch;
                                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}
Добавлено через 2 минуты
Упс точно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
        const int bufSize = 10;
        long sLen = -1;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc(bufSize*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
                str[sLen] = ch;
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}
Добавлено через 1 минуту
bufSize конечно же лучше поставить больше 10
У вас как раз первый вариант был лучше, так как не нужно было присваивать -1 sLen.

Вам просто нужно было (как, впрочем, и в вашем втором варианте) исправить код

C++
1
2
3
4
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
На

C++
1
2
3
4
                if ((sLen % bufSize) == 0 )
                {
                        str = (char *)realloc(str,(sLen + bufSize)*sizeof(char));
                }
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 18:48     Чтение строки неизвестной длины #38
Думаю всё же лучше так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
long i = 0, sLen = 0;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ äëèГ*Г*Гі ñòðîêè
    //ГЌГ*Г·Г*ëüГ*îå âûäåëåГ*ГЁГҐ ГЇГ*ìÿòè ГўГ±ГҐГЈГ® ïîä 1 ñèìâîë
    char ch, * str = (char *)malloc(1024*sizeof(char));
    printf("Enter string :\n");
    while((ch = getchar()) != '\n')
    {
        str[sLen + i] = ch;
        if(i < 1024)
            i++;
        else
        {
            str = (char *)realloc(str,(1024 + (sLen += 1024))*sizeof(char));
            i = 0;
        }
    }
    if(i < 1024)
        sLen += i;
    str[sLen] = '\0';
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 18:52     Чтение строки неизвестной длины #39
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вам просто нужно было (как, впрочем, и в вашем втором варианте) исправить код
стоп. а какая разница? не не не. Имх код первый нормальный только не учтен последний \0.
надо все ж проверить. думаю достаточно при аллоке и реалоке еще +1 сделать.

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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
        const int bufSize = 1024;
        long sLen = 0;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc((bufSize+1)*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                str[sLen] = ch;
                                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize+1)*sizeof(char));
                }
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}



Т.е. заносим сивол в массив, потом увиличиваем длинну (он же индекс). Если индекс вышел на границу (т.е. уже не допустим) добавляем памяти. +1 в функциях с памятью дает резерв для \0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 18:57     Чтение строки неизвестной длины #40
voral, зачем
Цитата Сообщение от voral Посмотреть сообщение
if ((sLen / bufSize)==1)
?
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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    long i = 0, sLen = 0;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ äëèГ*Г*Гі ñòðîêè
    //ГЌГ*Г·Г*ëüГ*îå âûäåëåГ*ГЁГҐ ГЇГ*ìÿòè ГўГ±ГҐГЈГ® ïîä 1 ñèìâîë
    char ch, * str = (char *)malloc(1024*sizeof(char));
    printf("Enter string :\n");
    while((ch = getchar()) != '\n')
    {
        str[sLen + i] = ch;
        if(i < 1024)
            i++;
        else
        {
            str = (char *)realloc(str,(1024 + (sLen += 1024))*sizeof(char));
            i = 0;
        }
    }
    if(i < 1024)
        sLen += i;
    str[sLen] = '\0';
    printf("Your input : \n");
    printf("%s\n",str);
    system("pause");//Ñòîï-òî÷êГ* ГЁГ*Г*Г·ГҐ ïðèëîæåГ*ГЁГҐ îòðГ*áîòГ*Гў Г±Г°Г*çó Г§Г*êðîåòñÿ
    return 0;
}
Enter string :
dsgfdg
Your input :
dsgfdg
Для продолжения нажмите любую клавишу . . .

Добавлено через 1 минуту
Если i < 1024 добавим это значение к sLen здесь
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(i < 1024)
* * * * * * * * sLen += i;
а так аллокаем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str = (char *)realloc(str,(1024 + (sLen += 1024))*sizeof(char));
предлагаю оттестировать, т.к мне уже нужно выходить...
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 19:01     Чтение строки неизвестной длины #41
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
voral, зачем?
ЗАмена вашего условия если длина (новый индекс) кратен разберу блока (1024) то необходимо расширять
Сыроежка
Заблокирован
23.11.2011, 19:02     Чтение строки неизвестной длины #42
Цитата Сообщение от voral Посмотреть сообщение
стоп. а какая разница? не не не. Имх код первый нормальный только не учтен последний \0.
надо все ж проверить. думаю достаточно при аллоке и реалоке еще +1 сделать.

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
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
        const int bufSize = 1024;
        long sLen = 0;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc((bufSize+1)*sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                str[sLen] = ch;
                                ++sLen;
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize+1)*sizeof(char));
                }
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}



Т.е. заносим сивол в массив, потом увиличиваем длинну (он же индекс). Если индекс вышел на границу (т.е. уже не допустим) добавляем памяти. +1 в функциях с памятью дает резерв для \0
C++
1
2
3
4
                if ((sLen / bufSize)==1)
                {
                        str = (char *)realloc(str,(sLen + bufSize+1)*sizeof(char));
                }
У вас программа будет корректно работать только если вы один раз увеличиваете объем буфера, так как выражение sLen / bufSize)==1 будет верно только один раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 19:08     Чтение строки неизвестной длины
Еще ссылки по теме:

Как ввести строку неизвестной длины - C++
Подскажите пожалуйста: у меня есть переменная: char chislo = &quot;&quot;; //Вводимое число неизвестной длины я пытаюсь ее ввести с клавиатуры с...

Создание массива чисел неизвестной длины - C++
Нужно сделать программу, которая считывает неизвестное наперёд количество чисел в массив. То есть чтобы можно было вводить любое количество...

Заполнить двумерный массив неизвестной длины - C++
Всем привет, пишу на C#, надо срочно написать код на С++ и я тупо ничего не догоняю ) Необходимо заполнить двумерный массив неизвестной...

Ввод динамического массива неизвестной длины - C++
Нужно создать динамический массив целых чисел, размер которого неизвестен, а каждое введенное число должно сразу помещатьмя в массив,...

Выделить память под массив неизвестной длины - C++
для программы нужен массив int Array т.е. длину строки я знаю, а сколько строк у меня будет - не представляю. я знаю, что...


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

Или воспользуйтесь поиском по форуму:
voral
427 / 407 / 56
Регистрация: 16.03.2008
Сообщений: 2,020
23.11.2011, 19:08     Чтение строки неизвестной длины #43
-=ЮрА=-, в целом избавились от одной переменой, и операций сложения и присваивания у меня меньше, а так же у вас дополнительное условие




Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас программа будет корректно работать только если вы один раз увеличиваете объем буфера, так как выражение sLen / bufSize)==1 будет верно только один раз.
Черт.... Эх я и .....
Yandex
Объявления
23.11.2011, 19:08     Чтение строки неизвестной длины
Ответ Создать тему
Опции темы

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