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

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

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

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

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

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

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

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

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

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

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

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

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

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


-=ЮрА=-, спасибо)
0
Thinker
Эксперт С++
4226 / 2200 / 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, я же вам уже объяснял разницу между указателем и массивом (в частности, динамическим, которого еще нет). Ну ладно вы алгоритмы писать не умеете, но хотя бы синтаксис нужно знать...

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


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

Не по теме:

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

0
Сыроежка
Заблокирован
23.11.2011, 16:32 #20
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

Вы написали глупость, так как очевидно еще пока слабо знаете С. fgets может работать со стандартными потоками, в том числе и с stdin
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 16:32 #21
Siend, что вы хотите реализовать - ввод с консоли или файловое чтение?
0
Сыроежка
Заблокирован
23.11.2011, 16:34 #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Siend, что вы хотите реализовать - ввод с консоли или файловое чтение?
Не запутывайте автора вопроса. Лучше сами разберитесь, как fgets работает с stdin
0
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
23.11.2011, 16:37 #23
5 копеек:
fgets
function
<cstdio>
char * fgets ( char * str, int num, FILE * stream );
Get string from stream

Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or a the End-of-File is reached, whichever comes first.
A newline character makes fgets stop reading, but it is considered a valid character and therefore it is included in the string copied to str.
A null character is automatically appended in str after the characters read to signal the end of the C string.

Parameters
str
Pointer to an array of chars where the string read is stored.
num
Maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used.
stream
Pointer to a FILE object that identifies the stream where characters are read from.
To read from the standard input, stdin can be used for this parameter.
0
Siend
2 / 2 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 16:45  [ТС] #24
-=ЮрА=-, с консоли, и Сыроежка прав, можно просто указать входной поток заместо файла, но меня ломает ради простого ввода строки так извращаться. не дорос я еще до высот программирования, поэтому вариант Юры мне очень приемлем)

Добавлено через 1 минуту
Пишу вообще под линукс, и помимо этого ввода еще нужно сделать обработчик сигналов и т.п. - там много всего) поэтому усложнять не хочется)
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 16:53 #25

Не по теме:

Сыроежка, я сейчас не способен вам достойно ответить ввиду 3-х кратного бана
я прекрасно знаю что такое fgets(str,256,stdin); оставьте свои догадки о моём знании/не знании при себе. Вы один раз уже пострадали, наверное уроков никаких не извлекли...



Добавлено через 1 минуту
Цитата Сообщение от Siend Посмотреть сообщение
-=ЮрА=-, с консоли,
- ввиду этого свою помощь в топике считаю оконченной, как и говорил Siend, успешной вам здачи!
0
Сыроежка
Заблокирован
23.11.2011, 17:06 #26
Цитата Сообщение от Siend Посмотреть сообщение
-=ЮрА=-, с консоли, и Сыроежка прав, можно просто указать входной поток заместо файла, но меня ломает ради простого ввода строки так извращаться. не дорос я еще до высот программирования, поэтому вариант Юры мне очень приемлем)

Добавлено через 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
29
30
#include   <stdio.h>
#include   <stdlib.h>
#include   <string.h>
#include   <conio.h>
 
int main( void )
{
   int size = BUFSIZ;
   int n = 0;
   char *s = malloc( size );
 
   while ( fgets( s, BUFSIZ, stdin ) != NULL )
   {
      char *p = strchr( s + n, '\n' );
      if ( p != NULL )
      {
         n = p - s;
         break;
      }
      size += BUFSIZ - 1;
      n     += BUFSIZ - 1;
      s = realloc( s, size );
   }
 
   s[n] = '\0';
 
   puts( s );
 
   getch();
}
Может быть я допустил опечатки при наборе текста. но тем не менее код правильный.

Преимущество этого кода по сравнению с тем, что вам предложили состоит в том, что если будет введена строка, состоящая, к примеру, из 127 символов, то вместо выделения памяти 127 раз, как это делается в первоначально предоженном вам варианте, здесь память будет выделяться только один раз. Как говорится, почувствуйте разницу.
0
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
23.11.2011, 17:41 #27
Цитата Сообщение от Сыроежка Посмотреть сообщение
C++
1
2
3
4
5
6
7
//...
   while ( fgets( s, BUFSIZ, stdin ) != NULL )
   {
      //...
      s = realloc( s, size );
   }
//...
Может быть я допустил опечатки при наборе текста. но тем не менее код правильный.
Не придираясь к тому, что нужно проверять результат вызова realloc(), что-то мне подсказывает, что на втором и следующих проходах fgets будет s с начала перезаписывать, при этом каждый раз честно увеличивая размер выделенной памяти...
0
voral
455 / 436 / 68
Регистрация: 16.03.2008
Сообщений: 2,130
23.11.2011, 17:49 #28
еще ТСу надо учесть, что этот код под винду (у ТС линукс) - немного надо отредактировать
0
Сыроежка
Заблокирован
23.11.2011, 17:51 #29
Цитата Сообщение от easybudda Посмотреть сообщение
Не придираясь к тому, что нужно проверять результат вызова realloc(), что-то мне подсказывает, что на втором и следующих проходах fgets будет s с начала перезаписывать, при этом каждый раз честно увеличивая размер выделенной памяти...
Ну, это опечатка. Я даже удивляюсь, как она появилась. Должно быть

C++
1
   while ( fgets( s + n, BUFSIZ, stdin ) != NULL )
Для этого переменная n и вводилась.
0
-=ЮрА=-
Заблокирован
Автор FAQ
23.11.2011, 18:16 #30
Siend, чтобы Вам было меньше возни, вот вам код аналогичный функционалу
Цитата Сообщение от Сыроежка Посмотреть сообщение
while ( fgets( s, BUFSIZ, stdin ) != NULL )
* *{
даже лучше(т.к аллокаем через каждые 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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2011, 18: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...


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

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

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