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

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

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

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

Заполнить двумерный массив неизвестной длины C++
Создание массива чисел неизвестной длины C++
Чтение из файла с пропуском комментария неизвестной длины C++
Как ввести строку неизвестной длины C++
C++ Ввод массива неизвестной длины
C++ Выделить память под массив неизвестной длины
Ввод динамического массива неизвестной длины C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mc.Duck
Заблокирован
23.11.2011, 15:04     Чтение строки неизвестной длины #2
C
1
2
3
4
5
6
7
...
int main()
{
char *str;
cin>>str; //я си не знаю, я на с++. Альтернатива входному потоку "cin" - "scanf"
}
...
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:10     Чтение строки неизвестной длины #3
Цитата Сообщение от Siend Посмотреть сообщение
как прочитать строку неизвестной длины? Чтение должно быть не посимвольным. Строка вводиться вручную.
- используем scanf
если нет пробелов то с таким спецификатором
scanf("%s",str); //str - наша строка
Если в строке есть пробелы, то используем продвинутый спецификатор
scanf("%[^\n]",str);

Также можно использовать функцию gets

Подробней о функциях здесь
scanf - ссылка
gets - ссылка


Добавлено через 15 секунд

Не по теме:

Цитата Сообщение от mc.Duck Посмотреть сообщение
char *str;
cin>>str;
- такой ввод ошибочен - под строку не выделена память, при большом объёме текста приложение обязательно обломится!При этом задание стоит
Цитата Сообщение от Siend Посмотреть сообщение
реализация на СИ
cin - это С++

Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:12  [ТС]     Чтение строки неизвестной длины #4
-=ЮрА=-, gets не подходит, он ведь посимвольно считаывает,
а касательно scanf("%s",str) - как должно быть определено str? мы ведь длину не знаем... char *str?
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:17     Чтение строки неизвестной длины #5
Siend, вы сказали что ввод должен быть не посимвольным, поэтому str должна быть константной большой длинны например char str[2048]; (я писал простой вариант)
Если же хотите динамическую строку(продвинутый вариант) сейчас покажу как это делается...
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:22     Чтение строки неизвестной длины #6
Вот пример динамического ввода
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    long sLen = 0;//Áóäåò ñîäåðæГ*ГІГј Гў Г±ГҐГЎГҐ äëèГ*Г*Гі ñòðîêè
    //ГЌГ*Г·Г*ëüГ*îå âûäåëåГ*ГЁГҐ ГЇГ*ìÿòè ГўГ±ГҐГЈГ® ïîä 1 ñèìâîë
    char ch, * str = (char *)malloc(sizeof(char));
    printf("Enter string :\n");
    while((ch = getchar()) != '\n')
    {
        str[sLen] = ch;
        str = (char *)realloc(str,(1 + (sLen++))*sizeof(char));
    }
    str[sLen] = '\0';
    printf("Your input : \n");
    printf("%s\n",str);
    system("pause");//Ñòîï-òî÷êГ* ГЁГ*Г*Г·ГҐ ïðèëîæåГ*ГЁГҐ îòðГ*áîòГ*Гў Г±Г°Г*çó Г§Г*êðîåòñÿ
    return 0;
}
Миниатюры
Чтение строки неизвестной длины  
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:25     Чтение строки неизвестной длины #7
Siend,
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while((ch = getchar()) != '\n')
- здесь на каждом символе проверяем не нажали ли Enter и если это не так пристыковываем этот символ к строке, не забывая при этом на 1 символ увеличить память отведенную под строку
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
str = (char *)realloc(str,(1 + (sLen++))*sizeof(char));
Согласитесь вариант посложней чем вариант
C
1
2
char str[2048];
scanf("%[^\n]",str);
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:30  [ТС]     Чтение строки неизвестной длины #8
-=ЮрА=-
посложнее, но мне бы еще посложнее)
я просто боюсь что препод докопается к тому что ввод посимвольный.а строку нельзя не в коем случае ограничивать - т.к. должна быть возможность ввести и 3000 символов. Вообще нужно только 200, но по спецификации проверка есть на то что строка которую считали оказалась больше 200, тобишь должна быть возможность считать и 1000 символов и больше. А если сделаю ограничение - препод сразу же введет строку длинее чем нужно. У меня есть мысль сделать через read(0,char str[203], 203), типо и проверка на наличие 201 символа будет, и ввести больше просто физически не даст, но мне не нравится то что стоит просто ограничение, вот хочу понять есть ли способ как-то считать символы в буфер а потом из буфера их по одному брать?)
А за пример спасибо - если не найду ничего лучше, то буду его использовать)
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:34     Чтение строки неизвестной длины #9
Цитата Сообщение от Siend Посмотреть сообщение
я просто боюсь что препод докопается к тому что ввод посимвольный.
- он не посимвольный, вы что Enter жмёте после каждой буквы?
Вы пишите текст и когда окончили его жмёте Enter(1 раз) - вы мой код пробовали?
PS:Вводить с кодом из 6-го поста вы можете пока ресурсов оперативной памяти хватит
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:49  [ТС]     Чтение строки неизвестной длины #10
да я то понимаю что он не посимвольный, но препод у нас зверь, он скажет что "вы используете функцию посимвольного ввода" и ему до лампочки что энтер жмем один раз)

Добавлено через 8 минут
-=ЮрА=-, решил использовать ваш метод) понравился очень, особенно тем что можно сделать сразу проверку на то какой символ введен, вот только забыл как именно мы проверяем по коду? по ASCII номера цифр с 48-57 включительно, шестнадцатиричной 30-39.
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 16:02     Чтение строки неизвестной длины #11
Цитата Сообщение от Siend Посмотреть сообщение
вот только забыл как именно мы проверяем по коду?
- десятиричка коды ASCII нагуглите, утром даже задание делал по выводу чаров ASCII (коды были от 0 до 127)
Написать программу, которая выводит на экран первую часть таблицы кодировки символов

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Siend Посмотреть сообщение
"вы используете функцию посимвольного ввода"
- ну это не посимвольный ввод (посимвольный анализ - это да), по другому право не знаю, выложил все свои козыри по СИ



Добавлено через 42 секунды
Siend, как вариант могу ещё с getch - пример дать, надо?
voral
362 / 342 / 46
Регистрация: 16.03.2008
Сообщений: 1,737
23.11.2011, 16:03     Чтение строки неизвестной длины #12
Как вариант использовать буфер постоянного размера. Считываем в него при помощи gets Потом приклевиаем к переменной (не забывая о выделении памяти)

Добавлено через 59 секунд
Для ускорения можно и память под строку блоками выделять. Например сначала 10Kb, заполнилась - занчит еще такой же блок.........
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 16:12  [ТС]     Чтение строки неизвестной длины #13
P.S.:
если кому понадобиться:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
int flag = 1;
        long sLen = 0;//Будет содержать в себе длинну строки
        //Начальное выделение памяти всего под 1 символ
        char ch, * str = (char *)malloc(sizeof(char));
        printf("Enter string :\n");
        while((ch = getchar()) != '\n')
        {
                flag=flag*isdigit(ch)//Вернет 0 если символ не цифра
                str[sLen] = ch;
                str = (char *)realloc(str,(1 + (sLen++))*sizeof(char));
        }
        str[sLen] = '\0';
        printf("Your input : \n");
        printf("%s\n",str);
        system("pause");//Стоп-точка иначе приложение отработав сразу закроется
        return 0;
}
Добавлено через 1 минуту
-=ЮрА=-, спасибо, я уже остановился на этом варианте) если препод будет возникать, переделаю через read чтоб вообще с защитой от дурака, и пусть только не примет)))

Добавлено через 3 минуты
voral, это для меня будет слишком сложно)
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 16:14     Чтение строки неизвестной длины #14
Siend, удачи Вам и успешной сдачи!
Сыроежка
Заблокирован
23.11.2011, 16:16     Чтение строки неизвестной длины #15
Цитата Сообщение от Siend Посмотреть сообщение
P.S.:
если кому понадобиться:

#include <stdio.h>
#include <stdlib.h>

int main()
{

long sLen = 0;//Будет содержать в себе длинну строки
//Начальное выделение памяти всего под 1 символ
char ch, * str = (char *)malloc(sizeof(char));
printf("Enter string :\n");
while((ch = getchar()) != '\n')
{
str[sLen] = ch;
str = (char *)realloc(str,(1 + (sLen++))*sizeof(char));
}
str[sLen] = '\0';
printf("Your input : \n");
printf("%s\n",str);
system("pause");//Стоп-точка иначе приложение отработав сразу закроется
return 0;
}

Добавлено через 1 минуту
-=ЮрА=-, спасибо, я уже остановился на этом варианте) если препод будет возникать, переделаю через read чтоб вообще с защитой от дурака, и пусть только не примет)))
Нет, такие творения никому не нужны! Это вы будете перевыделять память для каждого символа?! Это пример того, как не надо писать программы!

На самом деле ваша задача решается следующим образом.

Выделяете строку фиксированного размера. Можно использовать размер стандартного буфера, который обычно составляет 256 символов.

Читаете строку с помощью функции fgets, которая гарантирует, что буфер не будет переполнен в отличии от функции gets, которую вам здесь рекомендовали, и которую не следует использовать, так как она не гарантирует, что буфер не будет переполнен.

Затем смсотрите, считан ли символ новой строки. Если не считан, то тогда удваиваете размер вашего исходного буфера и с помощью realloc() выделяете новый участок памяти.

И так делаете до тех пор, пока в прочитанной строке не встретится символ новой строки '\n'
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 16:20  [ТС]     Чтение строки неизвестной длины #16
Сыроежка, на словах все ясно, но вот наглядный пример бы не помешал)


-=ЮрА=-, спасибо)
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
23.11.2011, 16:25     Чтение строки неизвестной длины #17
Цитата Сообщение от mc.Duck Посмотреть сообщение
C
1
2
3
4
5
6
7
...
int main()
{
char *str;
cin>>str; 
}
...

Не по теме:

mc.Duck, я же вам уже объяснял разницу между указателем и массивом (в частности, динамическим, которого еще нет). Ну ладно вы алгоритмы писать не умеете, но хотя бы синтаксис нужно знать...

Сыроежка
Заблокирован
23.11.2011, 16:27     Чтение строки неизвестной длины #18
Цитата Сообщение от Siend Посмотреть сообщение
Сыроежка, на словах все ясно, но вот наглядный пример бы не помешал)


-=ЮрА=-, спасибо)
Какой еще наглядный пример?! Вы должны написать программу. Я вам подсказал корректный алгоритм, как это делается в профессиональном коде. Реализуйте его. Начните хотя бы с малого. А ошибки я помогу исправить.
-=ЮрА=-
23.11.2011, 16:27
  #19

Не по теме:

Сыроежка, как я понял по заданию работаем с stdin, если уж зашла речь о файлом чтении, то извращаться с fgets с файлом тоже не ахти как функционально, открыли файл узнали длинну ftell и malloc-нули один раз строку под длинну файла и fread запихнули всё в буффер. На счёт gets ТС сам ответил что этот вариант неприемлим...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 16:32     Чтение строки неизвестной длины
Еще ссылки по теме:

C++ Чтение строки неограниченной длины и её параллельная обработка
Чтение из файла строки неизвестной длинны C++
Массив символов неизвестной длины C++
C++ Ввод массива заранее неизвестной длины
C++ Ввод массива заранее неизвестной длины

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
23.11.2011, 16:32     Чтение строки неизвестной длины #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

Сыроежка, как я понял по заданию работаем с stdin, если уж зашла речь о файлом чтении, то извращаться с fgets с файлом тоже не ахти как функционально, открыли файл узнали длинну ftell и malloc-нули один раз строку под длинну файла и fread запихнули всё в буффер. На счёт gets ТС сам ответил что этот вариант неприемлим...

Вы написали глупость, так как очевидно еще пока слабо знаете С. fgets может работать со стандартными потоками, в том числе и с stdin
Yandex
Объявления
23.11.2011, 16:32     Чтение строки неизвестной длины
Ответ Создать тему
Опции темы

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