Удалить все пробелы из строки в C#
В этом посте будет обсуждаться, как удалить все пробелы из строки в C#.
Есть несколько способов удалить пробел из строки в C#, который состоит из символа пробела, горизонтальной вкладки \t , возврат каретки \r , перевод строки \n , так далее.
1. Использование регулярных выражений
Шаблон регулярного выражения для пробельных символов: \s . Используя этот шаблон в регулярном выражении, мы можем либо заменить последовательные пробелы одним пробелом, либо удалить все пробелы из входной строки.
В следующем примере кода показано, как удалить все пробелы из входной строки.
убрать пробелы из строки средствами c#
Как лучше написать код для удаления символов пробела из строки?
![]()
Можно также добавить null-условный оператор:
Если необходимо убрать только пробелы из начала и конца строки, то можно воспользоваться методом Trim:
Если на входе будет null, то вернёт null.
![]()
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Удаление пробелов из строки в C?
Какой самый простой и эффективный способ удалить пробелы из строки в C?
Самый простой и самый эффективный — не обязательно одно и то же — Alan H
13 ответы
Самые простые и эффективные обычно не идут вместе .
Вот возможное решение:
Создан 03 июля ’19, 16:07
Что произойдет, если источник ввода был инициализирован строковым литералом? — Подавление огня
@Suppressingfire: если ты имеешь в виду RemoveSpaces(«blah»); , и не char a[] = «blah»; RemoveSpaces(a); , затем неопределенное поведение. Но это не вина этого кода. Не рекомендуется передавать строку только для чтения в функцию, которая задокументирована для изменения переданной ей строки (например, путем удаления пробелов) 😉 — Стив Джессоп
Думаю, вам стоит сделать * i = ‘\ 0’; в конце концов. — Ник Л.
* я = 0 и * я = ‘\ 0’ та же 🙂 — Уксио
Как . Как это работает? Я новичок в C и указателях, поэтому было бы очень полезно ознакомиться с происходящим — starcream_disco_party
Вот очень компактный, но совершенно правильный вариант:
И здесь, просто для моего развлечения, представлены версии с кодовым гольфом, которые не совсем верны и расстраивают комментаторов.
Если вы можете рискнуть каким-то неопределенным поведением и никогда не иметь пустых строк, вы можете избавиться от тела:
Черт возьми, если под пробелом вы подразумеваете просто пробел:
Не используйте это в продакшене 🙂
ответ дан 24 мая ’15, 13:05
Интересно, что на моей машине работают первые два. Но я предполагаю, что все они undefined, поскольку использование s ++ и * s в одном операторе приводит к неопределенному поведению? — Андомар
убедитесь, что вы не выходите за конец строки при разыменовании. — Кейси
@Andomar: Первый полностью в целости и сохранности. Последние два действительно отрывочны (проверено в GCC4.2). — Корнель
Назвать это «звуком», наверное, слишком вежливо. Все 3 версии полностью нечитаемы из-за отсутствия повышения производительности. Apple соглашается что скобки не нужны. Я имею в виду, что такое потери в миллионы долларов и все программисты в мире, смеющиеся над вами, по сравнению с чистой агонией, связанной с написанием скобок? — Лундин
Почему необходимо рисковать неопределенным поведением, если этот риск можно решить с помощью оператора запятой и for петля? — аутистический
Как видно из опубликованных ответов, это на удивление нетривиальная задача. Столкнувшись с такой задачей, может показаться, что многие программисты предпочитают выбросить здравый смысл из окна, чтобы создать самый непонятный фрагмент, который они могут придумать.
Что нужно учитывать:
- Вам нужно будет сделать копию строки с удаленными пробелами. Изменение переданной строки — плохая практика, это может быть строковый литерал. Кроме того, иногда есть преимущества обработки строк как неизменяемые объекты.
- Вы не можете предполагать, что исходная строка не пуста. Он не может содержать ничего, кроме одного нулевого символа завершения.
- Буфер назначения может содержать любой неинициализированный мусор при вызове функции. Проверка его на нулевое завершение не имеет никакого смысла.
- В документации к исходному коду должно быть указано, что целевой буфер должен быть достаточно большим, чтобы содержать обрезанную строку. Самый простой способ сделать это — сделать его размером с необрезанную струну.
- Буфер назначения должен содержать строку с завершающим нулем без пробелов, когда функция завершена.
- Подумайте, хотите ли вы удалить все символы пробелов или просто пробелы ‘ ‘ .
- Программирование на C — это не соревнование за то, кто может втиснуть как можно больше операторов в одну строку. Скорее наоборот, хорошая программа на C содержит читаемый код (всегда самое важное качество) без ущерба для эффективности программы (в некоторой степени важно).
- По этой причине вы не получаете бонусных баллов за сокрытие вставки нулевого завершения строки назначения, позволяя ему быть частью кода копирования. Вместо этого сделайте вставку нулевого завершения явной, чтобы показать, что вам не удалось сделать это правильно случайно.
Что я буду делать:
В этом коде исходная строка str_untrimmed остается нетронутой, что гарантируется использованием правильной константы. Не происходит сбоя, если исходная строка не содержит ничего, кроме нулевого завершения. Он всегда null завершает строку назначения.
Выделение памяти остается на усмотрение вызывающего абонента. Алгоритм должен быть сосредоточен только на выполнении своей предполагаемой работы. Удаляет все пробелы.
В коде нет тонких уловок. Он не пытается втиснуть как можно больше операторов в одну строку. Из него получится очень плохой кандидат на ОЦКК. Тем не менее, в результате будет получен практически тот же машинный код, что и в более неясных однострочных версиях.
Однако при копировании чего-либо вы можете немного оптимизировать, объявив оба указателя как restrict , который представляет собой контракт между программистом и компилятором, в котором программист гарантирует, что место назначения и источник не являются одним и тем же адресом (или, скорее, что данные, на которые они указывают, доступны только через этот самый указатель, а не через какой-либо другой указатель) . Это обеспечивает более эффективную оптимизацию, поскольку компилятор может затем копировать прямо из источника в место назначения без временной памяти между ними.