Форум программистов, компьютерный форум, киберфорум
D (DLang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/62: Рейтинг темы: голосов - 62, средняя оценка - 4.63
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Способы считывания строк из стандартного потока ввода

09.03.2015, 13:10. Показов 13021. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Предложите, пожалуйста, какие-нибудь более красивые способы считывания строк.
Например, у нас имеется N строк (в каждой строке по три слова, разделённые пробелами):
Inputstr1 str2 str3
example primer echoexample
catst cat vim
... ... ...

Я хочу считывать каждое слово в отдельную переменную типа string, чтобы обрабатывать его прямо на вводе.

Я делаю это так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
import std.stdio;
import std.string;
 
void main() {
 
    string a, b, c;
    foreach (i; 0 .. n) {
        a = readln(' ').strip;
        b = readln(' ').strip;
        c = readln.strip;
        // обработка строк
    }
}
Ещё можно сделать так:
C++
1
2
3
4
5
6
7
8
9
10
import std.stdio;
import std.string;
 
void main() {
 
    foreach (i; readln.split) {
        // теперь наши слова будут находиться в переменной i
        // можем обрабатывать их по очереди
    }
}
Можно, конечно, как-нибудь и readf'ами считать строки из потока ввода, но это будет тоже неудобно. Конечно, второй способ выглядит очень удобным, но имеет большой минус (мы не можем проводить действия сразу с тремя словами прямо на вводе).
Первый вариант меня устраивает больше, но мне не нравится его длинная запись.

Но больше всего мне нравится запись из C++:
C++
1
2
3
4
for (size_t i = 0; i < n; ++i) {
    std::cin >> a >> b >> c;
    // можем обрабатывать
}
Поделитесь, пожалуйста, своими вариантами.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.03.2015, 13:10
Ответы с готовыми решениями:

Считывание из стандартного потока ввода
Доброго времени суток, почему в данном коде: #include&lt;iostream&gt; int main(){ int a; char b; std::cin &gt;&gt; a &gt;&gt; b; ...

Перегрузка стандартного потока ввода
Суть задачи такова - есть перловский скрипт, который обрабатывает данные из файла, получаемые из перегрузки стандартного потока ввода в...

Считывание из стандартного потока ввода
Доброго времени суток . Столкнулся вот с такой проблемой . Есть функция , которая считывает со стандартного потока ввода код программы на...

9
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
10.03.2015, 23:54
Может быть то, что вы хотите находится в книге Александреску раздел 1.4 Массивы и ассоциативные массивы
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.03.2015, 00:16  [ТС]
XRuZzz, по-моему, так не выйдет, чтобы с помощью метода byLine() и функции splitter можно было бы одновременно присваивать трём переменным типа string слова. Вы будете по-прежнему работать с каждым словом по очереди. Можно, конечно, запоминать слова в массив string'ов, но я хочу именно заносить слова в auto-переменные. Ещё не забывайте, что после использования метода byLine вы получите тип char[], который придётся как-то преобразовывать в string.
Явно, такая сложная конструкция не будет выглядеть как-то так :
C++
1
2
3
4
for (size_t i = 0; i < n; ++i) {
    std::cin >> a >> b >> c;
    // можем обрабатывать
}
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
11.03.2015, 00:45
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Явно, такая сложная конструкция не будет выглядеть как-то так :

C++
1
2
3
4
for (size_t i = 0; i < n; ++i) {
 std::cin >> a >> b >> c;
 // можем обрабатывать
}
так в С++ ">>" это перегруженный оператор просто, который вероятно, считывает ваши слова не так эффективно как кажется.
Можно в D сделать такую же перегрузку оператора >>.
Я не понимаю как можно считать слово, не считав всю строку. У меня есть пример кода посимвольного чтения, но это совсем не то... Но на основе такого кода, можно сделать обработку события "появления пробела"
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.03.2015, 01:45  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
Можно в D сделать такую же перегрузку оператора >>.
А можете показать. Может быть, я потом буду использовать вашу конструкцию довольно часто.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
11.03.2015, 02:55
так я в первой теме и занимался такой фигнёй Язык "D"
в конце концов пришёл к alias https://github.com/xruzzz/axt-... ter/main.d
Кстати да - по второй ссылке по ходу ответ на ваш вопрос - форматированный ввод. сам уже забыл, что такое писал
У меня 2 репозитория на гитхабе, и каждому соответствует вопрос:
Первый репозиторий и первый вопрос - почему я не могу выйти, введя символ ☠. Правда отсутствие ответа меня не беспокоит.
Второй тут Не работает hello world [dlang, derelict]
Третий вопрос и репозиторий будет на тему «Как сделать простенькую p2p сеть на D»
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.03.2015, 03:21  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
так я в первой теме и занимался такой фигнёй
Ну и как заставить это работать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import std.stdio, std.system, std.string;
 
struct Td {
    public:
        bool opBinaryRight(string op)(string v)
            if (op == ">>") {
                v.readln(' ').strip;
                return true;
            }
}
 
void main() {
 
    // ...
}
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
11.03.2015, 06:04
Лучший ответ Сообщение было отмечено Dennis Ritchie как решение

Решение

А форматированный ввод чем то не угодил[по ссылке на гитхаб]?
C++
1
2
3
4
5
6
7
8
9
import std.stdio;
 
void main()
{
  string a, b, c;
  wchar con;
  readf(" %s %s %s", &a, &b, &c);
  readf(" %c", &con);
}
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Ну и как заставить это работать?
создать объект
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import std.stdio, std.system, std.string;
 
struct Td {
    public:
        void opBinary(string op)(out string v)
            if (op == ">>") {
                // ? enforce();
                readf(" %s", &v);
            }
}
 
void main() {
  Td cin;
  cin >> a;
}
но осознавая бессмысленность переделывания D в С++, отлаживать этот код я не буду. Нужно конечно дальше экспериментировать, чтобы добиться
C++
1
  cin >> a >> b >> c;
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Ещё не забывайте, что после использования метода byLine вы получите тип char[], который придётся как-то преобразовывать в string.
string это псевдоним для типа immutable(char)[]
Об этом пишет Александреску, в русском издании 2012 года, это, например, страница 481

Конечно самый правильный способ, разбирать регулярными выражениями то, что вводит пользователь. Это модуль regex. Вероятно, есть способ с помощью регулярки, поместить слова сразу в набор переменных. Обычно языки программирования это позволяют.

Добавлено через 7 минут
Думаю, тут std_regex инфы по регуляркам должно хватить.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
11.03.2015, 06:25  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
А форматированный ввод чем то не угодил[по ссылке на гитхаб]?
Так там какие-то непонятные символы в виде тараканов и т. д.
Вот это, то что нужно:
C++
1
readf(" %s %s %s\n", &a, &b, &c);
Просто я раньше забывал что-то дописать в этой записи, поэтому получалась какая-то ерунда.
Цитата Сообщение от XRuZzz Посмотреть сообщение
Нужно конечно дальше экспериментировать, чтобы добиться
Чтобы этого добиться нужно, наверное, гомогенную функцию использовать (хотя уже без разницы, так как это мне уже не нужно).
Цитата Сообщение от XRuZzz Посмотреть сообщение
string это псевдоним для типа immutable(char)[]
Логично:
C++
1
2
3
4
5
6
7
8
9
10
11
12
import std.stdio;
 
void main() {
 
    string s;
 
    immutable(char)[] t = "test";
 
    s = t;
 
    writeln(s);     // prints test
}
Цитата Сообщение от XRuZzz Посмотреть сообщение
Думаю, тут std_regex инфы по регуляркам должно хватить.
По этому примеру видно, что это неплохая штука:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import std.regex;
import std.stdio;
 
void main()
{
    // Print out all possible dd/mm/yy(yy) dates found in user input.
    auto r = regex(r"\b[0-9][0-9]?/[0-9][0-9]?/[0-9][0-9](?:[0-9][0-9])?\b");
    foreach(line; stdin.byLine)
    {
        // matchAll() returns a range that can be iterated
        // to get all subsequent matches.
        foreach(c; matchAll(line, r))
            writeln(c.hit);
    }
}
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
19.03.2015, 00:56  [ТС]
XRuZzz, вот то, что я хотел увидеть (хотя formattedRead() и не читает из потока ввода, но всё же):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import std.stdio : readln, writefln;
import std.format : formattedRead;
import std.string : strip;
 
void main() {
 
    int n = 5;
 
    foreach (i; 0 .. n) {
        auto s = readln.strip;
        string a, b, c;
        formattedRead(s, "%s %s %s", &a, &b, &c);
        writefln("!%s!, !%s!, !%s!", a, b, c);
    }
}
Code
1
2
3
4
5
6
7
8
9
10
A big project
!A!, !big!, !project!
Fish cat Dog
!Fish!, !cat!, !Dog!
I'm drink kefir
!I'm!, !drink!, !kefir!
Hello End World?
!Hello!, !End!, !World?!
Yes it's end
!Yes!, !it's!, !end!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2015, 00:56
Помогаю со студенческими работами здесь

Ввод слова со стандартного потока ввода
Разработайте программу, которая вводит со стандартного потока ввода числа и помещает их в список так, чтобы элементы его составляли...

Заполнить динамический массив из стандартного потока ввода
Тяжкий случай с динамическими массивами. И думаю не у меня одного. Вот пример заполнения массива данными: char *mess; ...

Как правильно распознать команды со стандартного потока ввода
Разработайте программу, использующую разработанный Вами класс , которая обрабатывает команды пользователя, вводимые им со стандартного...

Ввести со стандартного потока ввода числа и поместить их в список
Разработайте программу, которая вводит со стандартного потока ввода числа и помещает их в список так, чтобы элементы его составляли...

Как считать массив строк из стандартного ввода, если нет никакого сигнала об окончании ввода
Добрый день, сейчас изучаю язык C и попалась такая задача: Задача об отображении темы письма Time limit: 14 s Memory limit: 64 M ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru