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

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

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

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

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

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

как прочитать строку неизвестной длины? Чтение должно быть не посимвольным. Строка вводиться вручную.
0
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"
}
...
0
-=ЮрА=-
Заблокирован
Автор 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 - это С++

1
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:12  [ТС] #4
-=ЮрА=-, gets не подходит, он ведь посимвольно считаывает,
а касательно scanf("%s",str) - как должно быть определено str? мы ведь длину не знаем... char *str?
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:17 #5
Siend, вы сказали что ввод должен быть не посимвольным, поэтому str должна быть константной большой длинны например char str[2048]; (я писал простой вариант)
Если же хотите динамическую строку(продвинутый вариант) сейчас покажу как это делается...
0
-=ЮрА=-
Заблокирован
Автор 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;
}
2
Миниатюры
Чтение строки неизвестной длины  
-=ЮрА=-
Заблокирован
Автор 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);
1
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 символа будет, и ввести больше просто физически не даст, но мне не нравится то что стоит просто ограничение, вот хочу понять есть ли способ как-то считать символы в буфер а потом из буфера их по одному брать?)
А за пример спасибо - если не найду ничего лучше, то буду его использовать)
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 15:34 #9
Цитата Сообщение от Siend Посмотреть сообщение
я просто боюсь что препод докопается к тому что ввод посимвольный.
- он не посимвольный, вы что Enter жмёте после каждой буквы?
Вы пишите текст и когда окончили его жмёте Enter(1 раз) - вы мой код пробовали?
PS:Вводить с кодом из 6-го поста вы можете пока ресурсов оперативной памяти хватит
0
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:49  [ТС] #10
да я то понимаю что он не посимвольный, но препод у нас зверь, он скажет что "вы используете функцию посимвольного ввода" и ему до лампочки что энтер жмем один раз)

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

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

Не по теме:

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



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

Добавлено через 59 секунд
Для ускорения можно и память под строку блоками выделять. Например сначала 10Kb, заполнилась - занчит еще такой же блок.........
0
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, это для меня будет слишком сложно)
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 16:14 #14
Siend, удачи Вам и успешной сдачи!
1
Сыроежка
Заблокирован
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'
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 16:16
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.11.2011, 16:16
Ответ Создать тему
Опции темы

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