Как создать пустую строку
Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.
What can I do to prevent this in the future?
If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.
If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.
Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.
Cloudflare Ray ID: 71ab0836ff427318 • Your IP : 82.102.23.104 • Performance & security by Cloudflare
Строки
Строки – это объект типа string(System.String в нотации .Net) который хранит в себе текстовую строку. Хотя строки относят к примитивным типам данных, на самом деле это ссылочный тип. Внутри строк хранится коллекция символов типа char.
Строка является неизменяемым объектом, это значит, что после создания её нельзя изменить, а любые изменения, к примеру объединение, приводят к созданию новой строки.
Поскольку строковые переменные очень часто используются в программировании, язык C# предоставляет множество операций для работы со строками.
C# позволяет читать отдельные символы строки, обращаясь к отдельному символу по индексу, при это изменение не разрешено:
Создание строк
Строку можно создать присвоив ей значение строкового литерала, или с помощью оператора new:
Пустая строка и строка без значения
Пустая строка – это объект типа string, в котором не содержится символов, её длина равна нулю. В отличии от пустой строки, строка без значения(null-string), не ссылается на объект.
Создать пустую строку можно одним из способов:
IsNullOrEmpty — проверка на пустоту
Для проверки на null и пустоту используется метод IsNullOrEmpty, он возвращает true если строка пуста или равна null.
IsNullOrWhiteSpace
Метод принимает на вход строку и возвращает true если строка равна null, или состоит из пробельных символов.
Объединение строк
Для конкатенации(объединения) строк можно использовать метод Concat или операторы “+” и “+=”:
Для объединения последовательности(массива, коллекции) с разделителем, можно использовать метод Join:
Смена регистра
Для преобразования строк в нижний регистр используется метод ToLower, в верхний – ToUpper.
Сравнение строк
Равно или Equals
Equals – сравнивает на идентичность две строки(аналог оператора “==”). При сравнении учитывается регистр символов.
Equals может принимать дополнительный параметр StringComparison, который определяет настройки сравнения.
Compare
Сравнивает значения двух строк, возвращает целое число:
| Число | Значение |
|---|---|
| Отрицательное | Первая строка меньше второй, или имеет значение null |
| Ноль | Строки равны |
| Положительное | Вторая строка меньше первой, или имеет значение null |
сравнение производиться в порядке сортировки, при этом “A” меньше “B”, “D” больше “С”.
CompareOrdinal
Сравнение двух строк без учета языка и региональных параметров, возвращает результат аналогично предыдущему методу.
StartsWith
Возвращает true если строка начинается из подстроки, иначе false
EndsWith
Возвращает true если строка заканчивается на переданную подстроку, иначе false
Поиск подстрок
IndexOf
Производит поиск и возвращает позицию начала первого вхождения подстроки(символа), или -1 если подстрока не найдена.
LastIndexOf
Ищет заданный текст в строке и возвращает позицию начала последнго вхождения подстроки(символа), или -1 если подстрока не найдена.
Trim — удаление разделителей
Методы для удаления символов-разделителей из строки:
- Trim – удаляет символы с начала и конца строки;
- TrimStart – только из начала;
- TrimEnd – только из конца;
Вы можете передать в качестве аргумента метода, свой набор символов, которые нужно удалить из строки.
Разделение
Для того, чтобы разбить строку на части по разделителю(можно задать несколько сразу), можно воспользоваться методом Split.
Если таким образом разбить строку с несколькими разделителями подряд, то в результирующий массив, попадут пустые строки. Для того, чтобы исключить такой вариант, можно воспользоваться методом Split с параметром StringSplitOptions.RemoveEmptyEntries:
Получение подстроки
Метод Substring позволяет извлечь символ или подстроку из строки, в качестве аргументов задается начальный индекс и длина(если не указана, то до конца строки).
Редактирование строк
К операциям редактирования относят:
- поиск и замена;
- вставка подстроки;
- удаление части строк;
- функции дополнения.
Замена
Для замены символов или части строки, используется метод Replace, как аргументы принимает искомую подстроку и текст на который ее нужно заменить(аналог операции найти и заменить в текстовых редакторах):
Вставка
Метод Insert предназначен для вставки подстроки с указанной в качестве аргумента позиции.
Удаление
Метод Remove позволяет удалить часть строки. В качестве аргументов принимает позицию с которой начинается удаление, и количество символов, которые нужно удалить(если не указано, удаляются все символы до конца строки):
Дополнение строк
Для дополнения строки символами до указанной длины, используются методы:
- PadLeft – возвращает новую строку в дополненную слева указанными символами;
- PadRight – дополняет указанными символами справа.
Если символ для дополнения не указан, используется пробел.
Эти методы удобно использовать для вывода чисел и текста с выравниванием:
Работа со строками
Работа со строками очень важная часть программирования, потому что в любой программе приходиться оперировать текстовыми данными. Для этого в C# реализовано множество операций, которые покрывают большую часть потребностей при работе с текстами.
C#: строки (Strings)
Тип string (синоним System.String ) представляет беспрерывную последовательность юникод символов. Строковые литералы указываются внутри двойных кавычек.
String — ссылочный тип, однако операторы отношений взаимодействуют со строками как со значимыми типами:
Управляющие последовательности, применимые к типу char , могут использоваться и внутри строк:
Недостаток этого в том, что если нужно использовать символ обратного слэша \ , его нужно писать дважды (экранировать):
Чтобы избежать этой проблемы можно использовать дословные (буквальные, verbatim) строковые литералы. Эти литералы начинаются с символа @ и не поддерживают управляющих последовательностей. Они могут занимать несколько строк. Чтобы использовать внутри дословных литералов двойные кавычки их нужно писать дважды.
Объединение (concatenation) строк
Оператор + объединяет две строки:
Один из операндов может быть и не строкой. В этом случает для него скрыто будет вызван метод ToString :
Многократное использование оператора + для построения большой составной строки может быть не эффективным. Для этой цели лучше использовать тип System.Text.StringBuilder , который представляет динамически изменяющуюся строку и включает методы Append , Insert , Remove , и Replace .
Сравнение строк
Строки не поддерживают операторы < и > . Вместо них для сравнения строк нужно использовать строковой метод CompareTo , который возвращает 1 если первая строка предшествует второй, -1 если вторая строка предшествует первой и 0 если строки равны:
Поиск в строке и перечисление
Строковой индексатор возвращает символ с указанной позицией:
string реализует интерфейс IEnumerable<char> , поэтому по символам строки можно проходить с помощью foreach :
Простейшими методами для выполнения поиска в строке являются Contains , StartsWith , и EndsWith , все они возвращают true или false :
Метод IndexOf возвращает позицию первого вхождения заданного символа или подстроки (или -1 если символ или подстрока не найдены):
Методы StartsWith , EndsWith и IndexOf перегружены и могут принимать enum StringComparison или объект CultureInfo , чтобы управлять чувствительность к регистру и культуре:
Метод IndexOf также может принимать startPosition — индекс, с которого должен начинаться поиск.
Метод LastIndexOf похож на IndexOf , но ищет начиная с конца строки.
Метод IndexOfAny возвращает позицию первого вхождения любого символа из набора, а метод LastIndexOfAny делает тоже самое в обратном направлении:
Строковые операции
Поскольку строка является неизменной, все ее методы возвращают новое значения, оставляя исходную строку нетронутой. Помимо указанных выше строка имеет следующие методы:
- Substring — извлекает часть строки
- Insert и Remove — вставляют и удаляют символы в указанную позицию
- PadLeft и PadRight — добавляют пробелы в начали и конце строки
- TrimStart , TrimEnd , и Trim удаляют пробелы
- ToUpper и ToLower — преобразуют строку в верхний или нижний регистр
- Split — разбивает строку на подстроки по переданному разделителю
- Join — объединяет подстроки в строку
Конструирование строк
Простейший способ создать строку — это присвоение литерала:
Чтобы создать строку из повторяющейся последовательности символов можно использовать конструктор string :
Строку можно сконструировать из массива char . Метод ToCharArray делает обратное:
null и пустые строки
Чтобы создать пустую строку можно использовать литерал, либо статическое поле string.Empty . Пустая строка имеет нулевую длину и ее свойство Length равно нулю:
Поскольку строки являются ссылочными типами они могут принимать значение null :
Статический метод string.IsNullOrEmpty позволяет проверить является ли строка null или пустой.
Методы манипулирования строками
Поскольку строка является неизменяемой, все методы манипулирующие строкой возвращают новую строку, оставляя исходную незатронутой.
Метод Substring извлекает часть строки:
Методы Insert и Remove вставляют либо удаляют символы в указанной позиции:
Методы PadLeft и PadRight дополняют строку до заданной длины слева или справа указанным символом или пробелом если символ не указан. Если входная строка длиннее заданной длины для дополнения, исходная строка возвращается неизмененной:
Методы TrimStart и TrimEnd удаляют указанные символы с начала или конца строки, а метод Trim с двух сторон. Если символ для удаления не указан, удаляется пробельные символы:
Метод Replace заменяет все непересекающиеся вхождения заданного символа или подстроки на другой символ или строку:
Методы ToUpper и ToLower возвращают версию входной строки в верхнем или нижнем регистре с учетом языковых настроек пользователя, а методы ToUpperInvariant и ToLowerInvariant без их учета.
Объединение и разбиение строк
Метод Split принимает предложение и возвращает массив слов. По умолчанию в качестве разделителей метод использует пробельные символы. Перегруженная версия может принимать массив разделителей char или string . Также метод может принимать enum StringSplitOptions , который имеет опцию для удаления пустых элементов.
Статический метод Join выполняет действие противоположное методу Split . Он требует указания разделителя и строкового массива.
Статический метод Concat похож на Join , но принимает только строковой массив без разделителя. Он полностью эквивалентен операции + :
Сравнение строк
При сравнении строк применяются два базовых алгоритма:
- ординальное сравнение — символы интерпретируются как числа согласно их числовым кодам в Unicode
- сравнение чувствительно к культуре — символы интерпретируются со ссылкой на конкретный язык. Существует две специальные культуры: текущая культура — культура заданная в настройках конкретной машины; инвариантная культура — одинакова для всех компьютеров (американская культура)
Для сравнения эквивалентности строк можно использовать оператор == или один из методов Equals типа string . Последний существует в двух вариантах: статический и экземплярный. Статически метод полезен тем, что он работает, когда одна или обе строки равны null :
Оператор == и метод string.Equals вызванный без параметров всегда выполняют ординальное сравнение, чувствительное к регистру. Метод string.Equals вызванный с дополнительным параметром StringComparison comparisonType может выполнять сравнение с учетом культуры и нечувствиетльное к регистру. StringComparison определен следующим образом:
Для сравнения порядка могут быть использованы либо экземплярный метод CompareTo , либо статические Compare и CompareOrdinal . Они возвращают положительное, отрицательное число либо ноль в зависимости от того находится ли первое значение до, после или рядом со вторым.
Метод CompareTo выполняет чувствительное к культуре и регистру сравнение. Методы Compare и CompareOrdinal в зависимости от переданных аргументов могут выполнять разные виды сравнения:
StringBuilder
Класс System.Text.StringBuilder представляет изменяемую (редактируемую) строку. С его помощью можно добавлять (метод Append ), вставлять ( Insert ), удалять ( Remove ) и заменять ( Replace ) подстроки, не заменяя целиком StringBuilder . Конструктор StringBuilder дополнительно может принимать начальное значение строки, а также стартовую длину строки (по умолчанию 16 символов). Использование класса StringBuilder для построения строк более эффективно, чем выполнение множества конкатенаций строк.
Метод AppendLine добавляет подстроку и завершает ее символами новой строки ( \r\n ). Метод AppendFormat принимает смешанную форматную строку точно как String.Format . Класс StringBuilder также содержит свойство Length и индексатор для получения и установки отдельных символов.
Для очистки содержимого StringBuilder нужно либо создать новый экземпляр, либо установить его свойство Length равным 0 (последний вариант не уменьшит объем занимаемой памяти).
Кодировка
Стандартной кодировкой .NET для символов и строк является UTF-16, а для потокового ввода-вывода — UTF-8.
Класс System.Text.Encoding является базовым классом для типов, инкапсулирующих кодировки текста. Создать экземпляр Encoding можно с помощью статического метода Encoding.GetEncoding , передав ему стандартное имя IANA:
Экземпляры наиболее распространенных кодировок также могут быть получены через статические свойства Encoding :
Статический метод GetEncodings возвращает список всех поддерживаемых кодировок:
Также экземпляр Encoding можно создать с помощью конструктора. В этом случае можно задать дополнительные параметры, передав необходимые аргументы.
Форматирование и разбор (Formatting and Parsing)
Форматирование — преобразование в строку, разбор (парсинг) — преобразование из строки.
Методы ToString и Parse
Методы ToString и Parse являются стандартным механизмом для форматирования и разбора строк. ToString обеспечивает осмысленный вывод для всех простых значимых типов ( bool , DateTime , DateTimeOffset , TimeSpan , Guid и всех числовых типов). Для обратной операции в каждом из указанных типов определен статический метод Parse :
Метод Parse генерирует исключение FormatException в случае неудачной попытки разбора. Многие типы также определяют метод TryParse , который в случае неудачной попытки разбора возвращает false вместо генерации исключения.
Методы ToString , Parse и TryParse для числовых типов и классов DateTime и DateTimeOffset учитывают местные настройки культуры. Также им можно передать объект CultureInfo , содержащий иные настройки культуры, которые будут использованы вместо местных:
Интерфейс IFormattable
Метод ToString числовых типов и типов DateTime / DateTimeOffset реализует интерфейс IFormattable — стандартный интерфейс для поддержки форматных строк и поставщиков форматов:
В связи с этим метод ToString указанных типов может принимать в качестве дополнительных аргументов форматную строку и/или поставщиков форматов. Форматная строка предоставляет инструкции, поставщик формата определяет, как эти инструкции должны применяться:
В примере «C» — форматная строка, которая означает денежное значение (currency), а объект NumberFormatInfo — поставщик формата, определяющий, как должно визуализироваться денежное значение.
Если для форматной строки и поставщика указать null , будут использованы стандартные варианты. Стандартный поставщик формата — CultureInfo.CurrentCulture , который отражает настройки панели управления компьютера во время выполнения:
Для удобства большинство типов перегружаю метод ToString , чтобы null для поставщика можно было не указывать:
Вызов ToString без аргументов эквивалентен использованию стандартного поставщика формата с пустой форматной строкой.
Форматная строка
Существует два вида форматных строк:
- стандартные форматные строки — обеспечивают общее управление форматированием при преобразовании числа или даты/времени в строку; состоят из одной буквы, за которой может следовать цифра
- специальные форматные строки — позволяют контролировать при форматировании каждый символ с помощью шаблона, сотоящего из произвольного количества предопределенных символов
Подробно форматные строки для чисел и даты/времени рассматриваются в разделах, посвященных этим типам.
Поставщики форматов (Format Providers)
Поставщики форматов дают большую гибкость при форматировании и разборе строки, а также чувствительны к культуре. В .NET определены три поставщика формата (все реализуют интерфейс IFormatProvider ):
- NumberFormatInfo
- DateTimeFormatInfo
- CultureInfo
Все типы enum также поддерживают форматирование, но специальный поставщик формата для них не предусмотрен.
В контексте поставщиков формата CultureInfo представляет собой механизм косвенного обращения к двум другим поставщикам формата — NumberFormatInfo или DateTimeFormatInfo . Он возвращает NumberFormatInfo или DateTimeFormatInfo применимый к региональным настройкам культуры:
Создание строки в C (СИ)

Это используется если сразу известно что писать, а мне известно что писать только в процессе исполнения.

Подумай, что будет если ты попытаешься скопировать туда более 255-х байт?
дыры нет, так как данные константа
А что? «Privet, LOR» меньше 255 байт
А так нужно видать что-то типа:

Ну это пока константа, тебе ведь может прийти еретическая идея принимать данные из вне.

Если ты сделаешь man strcpy, то там сразу же увидишь ту функцию, которую надо использовать вместо strcpy.

Сегодня константа, завтра ты решил заюзать этот код для данных, приходящих по интернету, послезавтра хакеры украли твою кредитку и изнасиловали твоего кота. На си нельзя кодить неаккуратно.
изнасиловать кота бесценно, для остального есть MasterCard ))
Господа, так что с моим вопросом? 🙂
strncpy(temp, «Privet, LOR», 11);
Почитай разницу между strncpy и strcpy


Это параноики, щас скажут что 11 пришло из интернета и надо проверить не больше ли 11 длины буфера, заставят проверить что вернул malloc, что malloc надо заменить на alloc, сalloc, что менеджер памяти С говно, указатели небезопасные и ты ходишь по краю пропасти.
Не мучайся, возьми C++


Тому, у кого это получится, надо солдатским ремнём по мягким местам пройтись.
strncpy нужно передавать размер целевого буфера, чтобы тот не переполнить, а не исходного, который всё равно можно узнать при помощи strlen.
См. также: strlcpy, которая нестандартная, но не приводит к багам, когда strlen(source_string) == numofchars.
Да я уже взял, всё работает, но требуется вернуться к истокам.
Если известно, что длина строки небольшая, то зачем тут использовать malloc()? Можно и на стеке аллоцировать.
Далее в коде в неё что-то записать (размер этого что-то неизвестен)

Правильно. Но для надёжности можно сделать так:
Самая плохая функция, не пишет ‘\0’ если нет места, зато пишет лишние ‘\0’ если входная строка короче, проще скопипастить strlcpy из bsd если уж так хочется

А вообще все неправильно, строки в сишке медленные используй
А если и так не хочешь, создавай какой нибудь буфер для работы со строками.
Лучше не создавать типы, имена которых заканчиваются на _t, это не по-позиксному.

А как надо? STRING? struct string?
нужно #include <string>, ахаха

Да можно тогда сразу
Так тоже не по-позиксному. 🙂
Это неверный код, потому что вырашение слева имеет тип const char *. И совершенно другая семантика — константная строка известная на этапе компиляции vs. буффер для заполнения в runtime.
Технически конкретно этот кусок кода (без . ) правильный. Но это плохая практика, поскольку в реальном мире кто-нибудь рано или поздно изменит строку на «Privet, linux.org.ru», не вникнув полностью в весь остальной код, а в буффер вдобавок попадут недовалидированные данные извне, и 254 байта «внезапно» не хватит.
А вообще все неправильно, строки в сишке медленные используй
Пока мне достаточно если С строки будут быстрее std::string 🙂
Пока мне достаточно если С строки будут быстрее std::string 🙂
То, что ты демонстрируешь на С, будет быстрее работать даже на питоне. Не понимаешь, что в коде на С происходит, — не трогай С.
Ты ведь расскажешь, что ему помешает заюзать длину из интернета? И чем, в данном случае, ему поможет «та функция»? Ведь длинна берётся именно из интернета.