Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.98/196: Рейтинг темы: голосов - 196, средняя оценка - 4.98
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97

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

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

Студворк — интернет-сервис помощи студентам
реализация на СИ

как прочитать строку неизвестной длины? Чтение должно быть не посимвольным. Строка вводиться вручную.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2011, 14:40
Ответы с готовыми решениями:

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

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

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

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

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

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


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

Не по теме:

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

2
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:12  [ТС]
-=ЮрА=-, gets не подходит, он ведь посимвольно считаывает,
а касательно scanf("%s",str) - как должно быть определено str? мы ведь длину не знаем... char *str?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.11.2011, 15:17
Siend, вы сказали что ввод должен быть не посимвольным, поэтому str должна быть константной большой длинны например char str[2048]; (я писал простой вариант)
Если же хотите динамическую строку(продвинутый вариант) сейчас покажу как это делается...
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.11.2011, 15:22
Вот пример динамического ввода
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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.11.2011, 15:25
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
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:30  [ТС]
-=ЮрА=-
посложнее, но мне бы еще посложнее)
я просто боюсь что препод докопается к тому что ввод посимвольный.а строку нельзя не в коем случае ограничивать - т.к. должна быть возможность ввести и 3000 символов. Вообще нужно только 200, но по спецификации проверка есть на то что строка которую считали оказалась больше 200, тобишь должна быть возможность считать и 1000 символов и больше. А если сделаю ограничение - препод сразу же введет строку длинее чем нужно. У меня есть мысль сделать через read(0,char str[203], 203), типо и проверка на наличие 201 символа будет, и ввести больше просто физически не даст, но мне не нравится то что стоит просто ограничение, вот хочу понять есть ли способ как-то считать символы в буфер а потом из буфера их по одному брать?)
А за пример спасибо - если не найду ничего лучше, то буду его использовать)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.11.2011, 15:34
Цитата Сообщение от Siend Посмотреть сообщение
я просто боюсь что препод докопается к тому что ввод посимвольный.
- он не посимвольный, вы что Enter жмёте после каждой буквы?
Вы пишите текст и когда окончили его жмёте Enter(1 раз) - вы мой код пробовали?
PS:Вводить с кодом из 6-го поста вы можете пока ресурсов оперативной памяти хватит
0
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 15:49  [ТС]
да я то понимаю что он не посимвольный, но препод у нас зверь, он скажет что "вы используете функцию посимвольного ввода" и ему до лампочки что энтер жмем один раз)

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

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

Не по теме:

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



Добавлено через 42 секунды
Siend, как вариант могу ещё с getch - пример дать, надо?
1
3012 / 1446 / 262
Регистрация: 16.03.2008
Сообщений: 6,449
Записей в блоге: 2
23.11.2011, 16:03
Как вариант использовать буфер постоянного размера. Считываем в него при помощи gets Потом приклевиаем к переменной (не забывая о выделении памяти)

Добавлено через 59 секунд
Для ускорения можно и память под строку блоками выделять. Например сначала 10Kb, заполнилась - занчит еще такой же блок.........
0
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 16:12  [ТС]
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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
23.11.2011, 16:14
Siend, удачи Вам и успешной сдачи!
1
Заблокирован
23.11.2011, 16:16
Цитата Сообщение от 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
3 / 3 / 0
Регистрация: 23.11.2011
Сообщений: 97
23.11.2011, 16:20  [ТС]
Сыроежка, на словах все ясно, но вот наглядный пример бы не помешал)


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

Не по теме:

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

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


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

Не по теме:

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

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

Не по теме:

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

Вы написали глупость, так как очевидно еще пока слабо знаете С. fgets может работать со стандартными потоками, в том числе и с stdin
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.11.2011, 16:32
Помогаю со студенческими работами здесь

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

Считывание массива неизвестной длины
Имеется набор чисел. Про их количество ничего заранее неизвестно, кроме того, что оно кратно 10. Можно ли как-то сделать прерывание ввода...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru