Мое домашнее задание - взять строку и разбить ее на части в каждой новой строке. Я понятия не имею, что делать! Пожалуйста помоги!
Примечание: это вопрос кодового троллинга . Пожалуйста, не воспринимайте вопрос и / или ответы всерьез. Больше информации здесь .
code-trolling
Turion
источник
источник
Ответы:
С
Сложная задача для начинающего класса программирования C! Сначала вы должны понять несколько основ этой сложной темы.
Строка - это последовательность, состоящая только из символов . Это означает, что для того, чтобы программисты могли указать «невидимую» вещь (это не пробел, который считается символом), вы должны использовать специальную последовательность символов, чтобы обозначить эту невидимую вещь.
В Windows новая строка представляет собой последовательность из двух символов в строке: обратный слеш и n (или строка
"\n"
)В Linux или Mac OS / X это последовательность из четырех символов: обратная косая черта, n, обратная косая черта, а затем r: (или
"\n\r"
).(Интересное историческое примечание: на старых Macintoshes это была другая последовательность из четырех символов: "\ r \ n" ... полностью назад, от того, как Unix делал вещи! История идет странными путями.)
Может показаться, что Linux более расточительный, чем Windows, но на самом деле лучше использовать более длинную последовательность. Поскольку Windows использует такую короткую последовательность, среда выполнения языка C не может распечатывать реальные буквы
\n
без использования специальных системных вызовов. Обычно вы можете сделать это в Linux без системного вызова (он может даже печатать\n\
или\n\q
... что угодно, кроме\n\r
). Но поскольку C предназначен для кроссплатформенности, он обеспечивает наименьший общий знаменатель. Так что вы всегда будете видеть\n
в своей книге.(Примечание: если вам интересно, как мы говорим,
\n
не получая переводы строки каждый раз, когда мы делаем, StackOverflow написан почти полностью на HTML ... не на C. Так что это намного более современно. Многие из этих старых аспектов C обращаясь к тем вещам, о которых вы, возможно, слышали, таким как CLANG и LLVM.)Но вернемся к тому, над чем мы работаем. Давайте представим строку из трех частей и двух новых строк, например:
Вы можете видеть, что длина этой строки составляет 3 + 2 + 3 + 2 + 3 = 13. Поэтому вы должны создать для нее буфер длиной 13, и программисты на Си всегда добавляют один к размеру своих массивов, чтобы быть в безопасности. Так что сделайте ваш буфер и скопируйте в него строку:
Теперь вам нужно найти тот двухсимвольный шаблон, который представляет новую строку. Вам не разрешено искать только обратную косую черту. Поскольку C довольно часто используется для разбиения строк, при попытке вы получите ошибку. Вы можете увидеть это, если попытаетесь написать:
(Примечание: в компиляторе есть настройка, если вы пишете программу, которая просто ищет обратную косую черту. Но это крайне редко; обратные косые черты используются очень редко, поэтому они были выбраны для этой цели. включить.)
Итак, давайте сделаем шаблон, который мы действительно хотим, как это:
Когда мы хотим сравнить две строки определенной длины, мы используем
strncmp
. Он сравнивает определенное количество символов потенциально большей строки и сообщает вам, совпадают они или нет. Такstrncmp("\nA", "\nB", 2)
возвращает 1 (правда). Это даже при том, что строки не полностью равны по длине три ... но потому, что для этого нужно всего два символа.Итак, давайте пройдемся по нашему буферу по одному символу за раз, чтобы найти соответствие двух символов нашему шаблону. Каждый раз, когда мы находим двухсимвольную последовательность обратной косой черты, за которой следует n, мы будем использовать очень специальный системный вызов (или «системный вызов»)
putc
для вывода символа особого вида: код ASCII 10 , чтобы получить физическую новую строку ,Результатом этой программы является желаемый результат ... строка разбита!
\t
для \ троллинга ......
...
...
источник
Поздравляем! Теперь ваша строка должна быть разделена. Если нет, повторите шаги, пока это не так. Если вы повторили шаги пару раз, и струна пока не раскололась, попробуйте использовать более острые ножницы.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не несу ответственности за любой ущерб, нанесенный вам во время процесса.
источник
питон
Мне так плохо, что вам задали такой очевидный вопрос с подвохом, как домашнее задание. Очень продвинутый язык, такой как Python, делает это простым двухслойным:
Пожалуйста, проголосуйте и примите.
источник
С
В Си это действительно легко:
Назовите это так:
Рабочий пример:
http://codepad.org/GBHdz2MR
Почему это зло:
printf
функцию для разделения строк#define
(и даже тех, кто понимает )источник
Это можно сделать в несколько строк кода следующим простым алгоритмом:
Однако это расточительно. По сути, это алгоритм линейного поиска , который имеет линейную сложность по времени (O (n)). Я расскажу вам о более продвинутой технике: бинарный поиск . Бинарный поиск намного более эффективен, чем линейный поиск: он имеет только логарифмическую сложность времени (O (log (n))). Это означает, что если пространство поиска в два раза больше, время поиска не удваивается, оно только увеличивается на фиксированная сумма!
Код для бинарного поиска немного сложнее, потому что он использует передовые методы рекурсии и « разделяй и властвуй» . Но это определенно стоит выигрыша в производительности. Если вы отправите это, я ожидаю, что вы получите дополнительный кредит.
Суть алгоритма заключается в следующем:
Вы не указали язык, поэтому я написал его на Python. Конечно, в реальном мире люди не пишут на Python - используют C или C ++ (или даже лучше, язык ассемблера) для реальной производительности. Не беспокойтесь, если вы не понимаете, что делает весь код - это определенно продвинутый материал.
Конечно, все заявления о производительности являются поддельными. «Простой» алгоритм может быть линейным или квадратичным в зависимости от того, как вы его интерпретируете. «Продвинутый» алгоритм - это Θ (n × log (n)) (довольно близкий к линейному на практике), но мальчик - это высокая мультипликативная константа из-за непрекращающейся перестройки списка (которую реализация несколько упрощает, чтобы способствовать ).
Стиль Python, стиль комментариев, утверждения о выборе языка и обо всем остальном в этом посте также не отражают мое реальное мнение или привычки.
источник
Visual Basic
IO
Монада имеет функцию , чтобы сделать это!источник
C ++
std::strstream
strstream
std::
префиксаисточник
Python 3 (аккуратный и чистый)
источник
#define
? ;-)Рубин
Ну, вы видите, сначала вы должны превратить его в массив, как это
Теперь вы должны поместить элементы в виде строк
О, также удалите эту последнюю запятую
К сожалению, вы должны поставить скобки, чтобы быть массивом
Теперь просто используйте строку и все готово
злобности:
split
eval
'
или,
источник
Lua
Пример ввода:
"Hello\nworld\nstuff"
Вывод:
{"pieces","pieces","pieces","pieces","pieces","pieces"}
Ох, и я забыл упомянуть, что код O (n ^ 2)
источник
Node.js
Это так просто, любой программист может это -.-.
Сначала мы должны изменить
hosts
файл, чтобы.com, .net, .org
отобразить на127.0.0.1
.а остальное - базовый Javascript, который может понять любой нуб.
Вот и ты :)
источник
string.split('/n');
чтобы запутать студента-теоретика :).Рубин
Строки в программировании сделаны из Einsteintanium. Как таковые, их чрезвычайно трудно разделить.
К счастью для вас, у меня есть докторская степень по химии и программированию, поэтому я могу помочь.
Мы будем использовать рубин для этого.
Это зло, потому что:
источник
SplitStr
всегда разделяете символом новой строки, независимо от того, что аргумент, не уверен, намеренно лиC ++
Благодаря мощным новым возможностям языка программирования C ++ это можно легко решить с помощью стандартной библиотеки, не забывайте заново изобретать колесо .
Редактировать: Этот ответ, очевидно, просто пытается создать что-то глупо сложное для тривиальной задачи, и при этом злоупотребляет как можно большим количеством инструментов, все еще имея возможность писать код.
Вот несколько вещей, на которые стоит обратить внимание:
источник
C #
При этом используется технология рекурсии для преобразования строк в запятые. Результирующая строка CSV может быть легко разбита на массив.
источник
C ++
Выглядит вполне правдоподобно и учебно до последнего выражения. Это даже правильно, просто попробуйте объяснить это своему учителю.
Конечно, нет никаких оснований
std::for_each
, но это позволяет нам неправильно использовать лямбду. Эта лямбда выглядит так, как будто она что-то возвращает, но на самом деле это не так. Тернарный оператор существует только для побочных эффектов.источник
Хорошо! Таким образом, эту проблему очень легко решить с помощью нескольких малоизвестных функций python, включая операторы #define (они недавно перенесли их из C ++) и автоматическую регистрацию методов во встроенных классах.
Как это мило?
объяснение
... здесь довольно большой список троллинга.
На самом деле, программа работает (по крайней мере, в Python 3.3.0, и помимо проблемы однострочного ввода), так как куча вещей, которые заставляют ее не делать то, что она говорит, объединяются, чтобы заставить ее действительно работать.
источник
Цель ЛОЛКОД
источник
ANSI C
Это стандартное задание, которое все мы выполнили. Это общепринятое решение.
Вам нужно включить библиотеку с правильной функцией для разделения и печати.
#include <stdio.h>
Создайте строку, которую вы хотите разделить:
const char * input = "First Line\nSecond Line\nThird Line\n";
Обратите внимание, как я использовалconst
ключевое слово, чтобы проиллюстрировать, что у printf нет средств для изменения вашего ввода. Это важно, так как вы всегда хотите сохранить пользовательский ввод в его первоначальном виде для юридических целей.printf("%s", input);
делает разделение для вас, как вы можете видеть в выводе консоли.getchar();
это всего лишь небольшая дополнительная хитрость, чтобы сохранить консоль, пока вы проверяете вывод.Вход:
"First Line\nSecond Line\nThird Line\n"
Создает вывод:
источник
питон
Мы можем итеративно использовать строковый
find()
метод Python для разделения строки в каждом новом экземпляре строки (обратите внимание, что входная строка жесткоinput_str
задана как , но может быть заменена raw_input ()):Запустив вышеприведенный скрипт, мы получим ожидаемый результат (обратите внимание, что пробелы в начале и в конце согласуются с разбиением строки при каждом появлении новой строки):
источник
PHP / GD
Расщепление строк - это очень сложный вопрос. Хотя мы продолжили и сделали довольно простую реализацию для этого важного домашнего задания.
Работает без каких-либо зависимостей от последней версии PHP: количество примеров ограничено в размещенном коде, так как у нас здесь ограничение на количество символов около 40 000 символов, что не соответствует приличному количеству демонстрационных строк.
Пример версии:
http://codepad.viper-7.com/YnGvCn
Точно подтверждает ваши спецификации.
источник
Я не хочу быть злым, поэтому вот рабочий фрагмент кода Python, который разбивает вашу строку на части. Однако, поскольку вы не указали, где вы хотите, чтобы он был разделен, я просто выберу случайные места. Надеюсь, с тобой все в порядке.
источник
питон
источник
Для языков, которые поддерживают регулярные выражения и имеют
split
легкодоступную функцию, вы всегда должны использовать ее для разбиения строки. Это поможет вам не изобретать велосипед и сохранить ваш код коротким и приятным. Использование регулярных выражений также позволяет переносить код на другой язык без изменения регулярного выражения.Плохое решение
Есть это очевидное решение, где вы делите на
\n
или\r\n
:Джава
PHP
Это решение является мусором и никогда не должно использоваться. В наши дни бесполезно избегать Unicode, скорее каждый программист должен принять его и убедиться, что ваше приложение готово к Unicode. Если вы рассматриваете только
\n
или\r\n
как новый разделитель строк, вы пишете программное обеспечение в 90-х. В этом возрасте Юникода вы должны считать U + 0085, U + 2028, U + 2029 действительным разделителем строк. Поскольку Юникод время от времени обновляется, и обычно требуется некоторое время, прежде чем вы поймете, что он обновлен, возможно, в Юникод добавлен новый разделитель строк. Не беспокойтесь, потому что все механизмы регулярных выражений готовы к Unicode, и они регулярно обновляются, чтобы соответствовать последнему стандарту Unicode. Так что, если вы используете интерпретируемый язык, ваш код будет обновлен, и вы ничего не будете делать.Рекомендуемое решение
Чтобы разделить строку по разделителю строки и быть в курсе развития Unicode,
^
укажите регулярное выражение и укажитеMULTILINE
режим.По умолчанию соответствует
^
только началу строки. ВMULTILINE
режиме^
также соответствует началу строки, то есть после окончания строки.Например:
Джава
PHP
Обратите внимание, что впереди есть дополнительная пустая строка, просто удалите ее или цикл из индекса 1.
объяснение
На первый взгляд, это выглядит как хороший ответ с (несколько) рабочим решением в сочетании с объяснением с некоторыми рекомендациями по кодированию лучших практик. Однако само решение - это тролль ( «Я знаю, я буду использовать регулярные выражения. Теперь у них есть две проблемы. ), И весь пост усеян тонко неверной информацией, которая отравит любого новичка в программировании.
MULTILINE
режиме поведение^
и$
зависит от определения «терминатор строки». Java считает\r\n
,\n
,\r
,\u0085
,\u2028
,\u2029
чтобы линия терминатора, где\r\n
последовательность считается атомарным. JavaScript считает\n
,\r
,\u2028
,\u2029
чтобы линия терминаторы. Ruby считает только\n
терминатор строки.split
Функция может иметь разную семантику на разных языках для угловых случаев. Python не разбивает пустые совпадения, Java удаляет завершающие пустые строки (если вы не укажете отрицательный предел), JavaScript не разбивает пустое совпадение с индексом 0.источник
Bash скрипт
Это разбивает строку на новые строки. Если вы подтвердите
$new_string
, вы заметите, что он заменил новую строку на разделители массива.Пример вывода:
источник
Джава
Это не читает из файла. Регулярные выражения используются. Код предполагает, что прочитанная строка имеет символ '\ n' для обозначения новой строки. Цифры 1,2,3,4 используются для обозначения разделения.
источник
C #
источник
Вы не указываете, является ли "новая строка", на которую вы хотите разбить строку, чувствительной к регистру или нечувствительной. Я предполагаю нечувствительным.
источник
Чувак, это очень легко сделать в Powershell.
Просто получите вашу строку, как это:
Затем перебирайте случайный ascii до тех пор, пока ваша строка не будет разбита на две части так:
в итоге вы должны получить строку split, которую вы можете вывести так:
Выход:
источник
Php
Вот как вы разделяете строку. Разве это не так просто?
Все, что вам нужно сделать сейчас, это написать функцию
Spliter()
источник
специфичный для bash
У bash отличная работа !
Да, разделение строки может быть сделано очень простым способом:
Сначала вам нужно инициализировать переменную, которую вы будете использовать для хранения вашего разбитого результата:
Теперь, когда каждая строка разделена двумя разделителями, началом или концом строки, вам понадобится переменная для хранения первой
Хорошо, теперь вы можете искать разделитель и хранить ваши строки, используя цикл . Так как bash не может работать с двоичными значениями, вы можете использовать инструмент, например,
od
для работы с шестнадцатеричными значениями, например:Теперь у нас есть разделенная строка, хранящаяся в переменной
lines
:Чтобы мы могли печатать используя:
Собираем все это в один скрипт:
Это напечатает:
Современная Баш
Но используя современную реализацию bash , вы можете хранить управляющие символы, такие как newline, в переменные и даже тестировать их:
Баш Гольф
Но если вы не заботитесь о читабельности, вы можете написать сокращенный скрипт, например:
Сценарий для гольфа может выглядеть так:
и даст тот же эффект: в первой строке разбить строку и сохранить их в массив с именем линии . А вторая строка будет печатать каждый элемент массива '' lines '', за которым следует новая строка .
консоль bash + vt
Но так как многие люди используют текстовую консоль на основе стандарта ANSI VT , вы можете использовать VT-поведение вашей консоли и написать еще раз:
даст тот же результат.
источник