String. Substring Метод
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Извлекает подстроку из данного экземпляра.
Этот член перегружен. Для получения полной информации о данном члене, включая синтаксис, использование и примеры, щелкните имя в списке перегрузок.
Перегрузки
Извлекает подстроку из данного экземпляра. Подстрока начинается в указанном положении символов и продолжается до конца строки.
Извлекает подстроку из данного экземпляра. Подстрока начинается с указанной позиции знака и имеет указанную длину.
Substring(Int32)
Извлекает подстроку из данного экземпляра. Подстрока начинается в указанном положении символов и продолжается до конца строки.
public: System::String ^ Substring(int startIndex);
public string Substring (int startIndex);
member this.Substring : int -> string
Public Function Substring (startIndex As Integer) As String
Параметры
startIndex Int32
Отсчитываемая от нуля позиция первого знака подстроки в данном экземпляре.
Возвращаемое значение
Строка, эквивалентная подстроке, которая начинается с startIndex в данном экземпляре, или Empty, если значение startIndex равно длине данного экземпляра.
Исключения
startIndex имеет значение меньше нуля или больше длины этого экземпляра.
Примеры
В следующем примере показано получение подстроки из строки.
using namespace System; using namespace System::Collections; int main() < array^info = < "Name: Felica Walker", "Title: Mz.", "Age: 47", "Location: Paris", "Gender: F">; int found = 0; Console::WriteLine("The initial values in the array are:"); for each (String^ s in info) Console::WriteLine(s); Console::WriteLine("\nWe want to retrieve only the key information. That is:"); for each (String^ s in info) < found = s->IndexOf(": "); Console::WriteLine(" ", s->Substring(found + 2)); > > // The example displays the following output: // The initial values in the array are: // Name: Felica Walker // Title: Mz. // Age: 47 // Location: Paris // Gender: F // // We want to retrieve only the key information. That is: // Felica Walker // Mz. // 47 // Paris // F
string [] info = < "Name: Felica Walker", "Title: Mz.", "Age: 47", "Location: Paris", "Gender: F">; int found = 0; Console.WriteLine("The initial values in the array are:"); foreach (string s in info) Console.WriteLine(s); Console.WriteLine("\nWe want to retrieve only the key information. That is:"); foreach (string s in info) < found = s.IndexOf(": "); Console.WriteLine(" ", s.Substring(found + 2)); > // The example displays the following output: // The initial values in the array are: // Name: Felica Walker // Title: Mz. // Age: 47 // Location: Paris // Gender: F // // We want to retrieve only the key information. That is: // Felica Walker // Mz. // 47 // Paris // F
let info = [| "Name: Felica Walker"; "Title: Mz." "Age: 47"; "Location: Paris"; "Gender: F" |] printfn "The initial values in the array are:" for s in info do printfn $"" printfn "\nWe want to retrieve only the key information. That is:" for s in info do let found = s.IndexOf ": " printfn $" " // The example displays the following output: // The initial values in the array are: // Name: Felica Walker // Title: Mz. // Age: 47 // Location: Paris // Gender: F // // We want to retrieve only the key information. That is: // Felica Walker // Mz. // 47 // Paris // F
Public Class SubStringTest Public Shared Sub Main() Dim info As String() = < "Name: Felica Walker", "Title: Mz.", "Age: 47", "Location: Paris", "Gender: F">Dim found As Integer = 0 Console.WriteLine("The initial values in the array are:") For Each s As String In info Console.WriteLine(s) Next s Console.WriteLine(vbCrLf + "We want to retrieve only the key information. That is:") For Each s As String In info found = s.IndexOf(": ") Console.WriteLine(" ", s.Substring(found + 2)) Next s End Sub End Class ' The example displays the following output: ' The initial values in the array are: ' Name: Felica Walker ' Title: Mz. ' Age: 47 ' Location: Paris ' Gender: F ' ' We want to retrieve only the key information. That is: ' Felica Walker ' Mz. ' 47 ' Paris ' F
В следующем примере метод используется Substring для разделения пар «ключ-значение», разделенных символом равенства ( = ).
String[] pairs = < "Color1=red", "Color2=green", "Color3=blue", "Title=Code Repository" >; foreach (var pair in pairs) < int position = pair.IndexOf("="); if (position < 0) continue; Console.WriteLine("Key: , Value: ''", pair.Substring(0, position), pair.Substring(position + 1)); > // The example displays the following output: // Key: Color1, Value: 'red' // Key: Color2, Value: 'green' // Key: Color3, Value: 'blue' // Key: Title, Value: 'Code Repository'
let pairs = [| "Color1=red"; "Color2=green"; "Color3=blue" "Title=Code Repository" |] for pair in pairs do let position = pair.IndexOf "=" if position >= 0 then printfn $"Key: , Value: ''" // The example displays the following output: // Key: Color1, Value: 'red' // Key: Color2, Value: 'green' // Key: Color3, Value: 'blue' // Key: Title, Value: 'Code Repository'
Module Example Public Sub Main() Dim pairs() As String = < "Color1=red", "Color2=green", "Color3=blue", "Title=Code Repository" >For Each pair In pairs Dim position As Integer = pair.IndexOf("=") If position < 0 then Continue For Console.WriteLine("Key: , Value: ''", pair.Substring(0, position), pair.Substring(position + 1)) Next End Sub End Module ' The example displays the following output: ' Key: Color1, Value: 'red' ' Key: Color2, Value: 'green' ' Key: Color3, Value: 'blue' ' Key: Title, Value: 'Code Repository'
Метод IndexOf используется для получения позиции символа равенства в строке. Вызов Substring(Int32, Int32) метода извлекает имя ключа, которое начинается с первого символа в строке и расширяет число символов, возвращаемых вызовом IndexOf метода . Затем вызов Substring(Int32) метода извлекает значение, назначенное ключу. Он начинается с одной позиции символа за пределами символа равного и простирается до конца строки.
Комментарии
Метод вызывается Substring(Int32) для извлечения подстроки из строки, которая начинается с указанной позиции символа и заканчивается в конце строки. Начальная позиция символа отсчитывается от нуля; другими словами, первый символ в строке находится в индексе 0, а не в индексе 1. Чтобы извлечь подстроку, которая начинается с указанной позиции символа и заканчивается до конца строки, вызовите Substring(Int32, Int32) метод .
Этот метод не изменяет значение текущего экземпляра. Вместо этого он возвращает новую строку, которая начинается с startIndex позиции в текущей строке.
Чтобы извлечь подстроку, которая начинается с определенного символа или последовательности символов, вызовите метод, например IndexOf или IndexOf , чтобы получить значение startIndex . Второй пример иллюстрирует это; Извлекает ключевое значение, которое начинается на одну позицию символа после символа = .
Если startIndex равно нулю, метод возвращает исходную строку без изменений.
См. также раздел
- Int32
- Concat(Object)
- Insert(Int32, String)
- Join(String, String[])
- Remove(Int32, Int32)
- Replace(Char, Char)
- Split(Char[])
- Trim(Char[])
Как прочесть символ конца строки '\n' в файле?
Решил прочесть из текстового файла матрицу и определить количество строк и столбцов. Исхожу из соображений, что данные, записанные в текстовый файл, представляют собой некий одномерный массив, разделенный символами конца строк '\n'. Построчный анализ в окне Debug показывает, что реализованный код читает все символы, а символ конца строки пропускает, перескакивая на следующую строку. Никак не могу понять где ошибка. Помогите!
#include #include using namespace::std; int main()< int i = 0; // индекс элементов строки ФАЙЛА int row_size = 0; // количество строк матрицы int column_size = 0; // количество столбцов матрицы char* buffer; // указатель на адрес, по которому должны временно размещаться числа, полученные из строки файла ifstream input_data("The_Matrix.txt"); if(!input_data.is_open())< cout else< while(input_data>>buffer) < if(*buffer=='\n')< column_size=i; i = 0; row_size++; >i++; > > cout
Отслеживать
задан 7 янв 2020 в 14:39
299 2 2 серебряных знака 18 18 бронзовых знаков
buffer используется неинициализированным, символ конца строки пропускает - читайте про работу оператора >>
7 янв 2020 в 14:42
После чтения по неинициализированному адресу больше разбирать нечего - UB, возможно всё.
7 янв 2020 в 14:47
В строке char * buffer; объявлена переменная buffer . которая должна содержать указатель на char , но содержит случайное значение.
Строки в C++
Для работы со строкам в C++ используется тип string . В разделе про потоки мы уже создавали объекты типа string и использовали их с операторами > . Рассмотрим этот тип подробнее.
Примеры создания объектов string :
string a; // пустая строка string b("abc"); // строка проинициализирована списком символов string c1(b); // c1 является копией b string c2 = b; // c2 является копией b string d('d', 10); // d = "dddddddddd"
Строки хранят в памяти последовательность объектов char , поэтому во многих случаях со строками можно работать как с массивом. Например, обращаться к символам через индекс.
string a("abz"); char c = a[2]; // 'z' char b = a.at(1); // 'b' a[2] = 'c'; // a = "abc"
Механизмы обращения к элементу через оператор [] и с помощью метода at() отличаются. В первом случае не происходит проверки того, что индекс меньше, чем длина строки. Если это условие не выполняется, то мы приходим к ситуации неопределенного поведения. Метод at() выполняет эту проверку и генерирует исключение в случае некорректного индекса. За это более безопасное поведение мы платим процессорным временем для дополнительной проверки.
По символам строки можно пройти в цикле:
string s("abcde"); for (char ch : s) cout <ch <' '; >
Узнать длину строки можно с помощью метода size() .
Строки можно конкатенировать с помощью оператора + или метода append :
string a("Hello, "); string b("world!"); string c = a + b; // "Hello, world!" a.append(b); // a = "Hello, world!" a += b; // a = "Hello, world!world!"
Добавить символ в конец строки можно с помощью метода push_back() , а удалить последний символ - с помощью метода pop_back() .
В типе string реализованы некоторые алгоритмы. Например, можно осуществлять поиск по строке:
string line("There are two needles in this haystack with needles."); string query("needle"); size_t found = line.find(query); // found = 14 if (found != string::npos) cout <"first '" <query <"' found at: " <found <'\n'; >
Метод find() возвращает позицию первого символа, которому соответствует совпадение. Если совпадений не найдено, возвращается специальная константа. size_t - это беззнаковый целочисленный тип.
Больше возможностей типа string можно найти в документации.
Документация
- en.cppreference.com/w/cpp/string/basic_string
- en.cppreference.com/w/cpp/header/cctype
Как найти конец строки в c
Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва
Репутация: нет
Всего: нет
как при чтении данных из файла с помощью fstream определить что строка кончилась, а ещё лучше - установить указатель на следующую строку?
| Дата 19.5.2008, 00:56 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
| Цитата(Flashdown @ 19.5.2008, 00:08 ) |
| с помощью fstream определить что строка кончилась |
проверяй код символа. конец стоки это \r\n или \n
| Дата 19.5.2008, 01:17 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва
Репутация: нет
Всего: нет
если в цикле считывать данные в переменную типа char , то символ конца строки в неё не попадает.
| Дата 19.5.2008, 01:27 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006
Репутация: 144
Всего: 250
а файл открыт как? как бинарный?
| Дата 19.5.2008, 08:16 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва
Репутация: нет
Всего: нет
как его не открывай, всё равно не читает конец строки!
| Дата 19.5.2008, 08:40 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 85
Регистрация: 27.5.2006
Где: Москва
Репутация: нет
Всего: нет
надо было просто
ifs.getline(str, 1024, '\n');
сделать)
| Дата 19.5.2008, 22:12 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 72
Регистрация: 1.11.2006
Репутация: нет
Всего: нет
Считывать можно разными способами:
istream::operator >>
istream::get
istream::read
По крайней мере один их них точно не проглатывает пустое пространство (конец строк и т. п.). Если я не ошибаюсь, это get и read.
т. о. код будет такой:
| Код |
| while(cin.get()!='\n'&&cin); |