Перейти к содержимому

Как удалить string c

  • автор:

String. Remove Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

Возвращает новую строку, в которой удалено указанное число знаков текущей строки.

Перегрузки

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

Возвращает новую строку, в которой было удалено указанное число символов в указанной позиции.

Remove(Int32)

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

public: System::String ^ Remove(int startIndex);
public string Remove (int startIndex);
member this.Remove : int -> string
Public Function Remove (startIndex As Integer) As String
Параметры

startIndex Int32

Отсчитываемая от нуля позиция, с которой начинается удаление знаков.

Возвращаемое значение

Новая строка, эквивалентная данной строке за минусом удаленных знаков.

Исключения

Значение параметра startIndex меньше нуля.

startIndex указывает положение, которое находится за пределами этой строки.

Примеры

В следующем примере демонстрируется Remove метод. Следующий к последнему варианту удаляет весь текст, начиная с указанного индекса до конца строки. В последнем случае удаляются три символа, начиная с указанного индекса.

// This example demonstrates the String.Remove() method. using namespace System; int main() < String^ s = "abc---def"; // Console::WriteLine( "Index: 012345678" ); Console::WriteLine( "1) ", s ); Console::WriteLine( "2) ", s->Remove( 3 ) ); Console::WriteLine( "3) ", s->Remove( 3, 3 ) ); > /* This example produces the following results: Index: 012345678 1) abc---def 2) abc 3) abcdef */ 
// This example demonstrates the String.Remove() method. using System; class Sample < public static void Main() < string s = "abc---def"; Console.WriteLine("Index: 012345678"); Console.WriteLine("1) ", s); Console.WriteLine("2) ", s.Remove(3)); Console.WriteLine("3) ", s.Remove(3, 3)); > > /* This example produces the following results: Index: 012345678 1) abc---def 2) abc 3) abcdef */ 
// This example demonstrates the String.Remove() method. let s = "abc---def" printfn "Index: 012345678" printfn $"1) " printfn $"2) " printfn $"3) " (* This example produces the following results: Index: 012345678 1) abc---def 2) abc 3) abcdef *) 
' This example demonstrates the String.Remove() method. Class Sample Public Shared Sub Main() Dim s As String = "abc---def" ' Console.WriteLine("Index: 012345678") Console.WriteLine("1) ", s) Console.WriteLine("2) ", s.Remove(3)) Console.WriteLine("3) ", s.Remove(3, 3)) End Sub End Class ' 'This example produces the following results: ' 'Index: 012345678 '1) abc---def '2) abc '3) abcdef ' 

Комментарии

В платформа .NET Framework строки отсчитываются от нуля. Значение параметра может быть в диапазоне startIndex от нуля до одного меньше длины экземпляра строки.

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

См. также раздел

  • Int32
  • Concat(Object)
  • Insert(Int32, String)
  • Join(String, String[])
  • Replace(Char, Char)
  • Split(Char[])
  • Substring(Int32)
  • Trim(Char[])

Применяется к

Remove(Int32, Int32)

Возвращает новую строку, в которой было удалено указанное число символов в указанной позиции.

public: System::String ^ Remove(int startIndex, int count);
public string Remove (int startIndex, int count);
member this.Remove : int * int -> string
Public Function Remove (startIndex As Integer, count As Integer) As String
Параметры

startIndex Int32

Отсчитываемая от нуля позиция, с которой начинается удаление знаков.

Число символов для удаления.

Возвращаемое значение

Новая строка, эквивалентная данному экземпляру за минусом удаленных знаков.

Исключения

Значение параметра startIndex или count меньше нуля.

startIndex плюс count указывает позицию за пределами этого экземпляра.

Примеры

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

using namespace System; int main() < String^ name = "Michelle Violet Banks"; Console::WriteLine( "The entire name is ''", name ); // remove the middle name, identified by finding the spaces in the middle of the name->->. int foundS1 = name->IndexOf( " " ); int foundS2 = name->IndexOf( " ", foundS1 + 1 ); if ( foundS1 != foundS2 && foundS1 >= 0 ) < name = name->Remove( foundS1 + 1, foundS2 - foundS1 ); Console::WriteLine( "After removing the middle name, we are left with ''", name ); > > // The example displays the following output: // The entire name is 'Michelle Violet Banks' // After removing the middle name, we are left with 'Michelle Banks' 
using System; public class RemoveTest < public static void Main() < string name = "Michelle Violet Banks"; Console.WriteLine("The entire name is ''", name); // Remove the middle name, identified by finding the spaces in the name. int foundS1 = name.IndexOf(" "); int foundS2 = name.IndexOf(" ", foundS1 + 1); if (foundS1 != foundS2 && foundS1 >= 0) < name = name.Remove(foundS1 + 1, foundS2 - foundS1); Console.WriteLine("After removing the middle name, we are left with ''", name); > > > // The example displays the following output: // The entire name is 'Michelle Violet Banks' // After removing the middle name, we are left with 'Michelle Banks' 
let name = "Michelle Violet Banks" printfn $"The entire name is ''" // Remove the middle name, identified by finding the spaces in the name. let foundS1 = name.IndexOf " " let foundS2 = name.IndexOf(" ", foundS1 + 1) if foundS1 <> foundS2 && foundS1 >= 0 then let name = name.Remove(foundS1 + 1, foundS2 - foundS1) printfn $"After removing the middle name, we are left with ''" // The example displays the following output: // The entire name is 'Michelle Violet Banks' // After removing the middle name, we are left with 'Michelle Banks' 
Public Class RemoveTest Public Shared Sub Main() Dim name As String = "Michelle Violet Banks" Console.WriteLine("The entire name is ''", name) Dim foundS1 As Integer = name.IndexOf(" ") Dim foundS2 As Integer = name.IndexOf(" ", foundS1 + 1) If foundS1 <> foundS2 And foundS1 >= 0 Then ' remove the middle name, identified by finding the spaces in the middle of the name. name = name.Remove(foundS1 + 1, foundS2 - foundS1) Console.WriteLine("After removing the middle name, we are left with ''", name) End If End Sub End Class ' The example displays the following output: ' The entire name is 'Michelle Violet Banks' ' After removing the middle name, we are left with 'Michelle Banks' 

Комментарии

В платформа .NET Framework строки отсчитываются от нуля. Значение параметра может быть в диапазоне startIndex от нуля до одного меньше длины экземпляра строки.

Этот метод не изменяет значение текущего экземпляра. Вместо этого он возвращает новую строку, в которой было удалено количество символов, указанное параметром count . Символы удаляются в позиции, указанной параметром startIndex .

См. также раздел

  • Int32
  • Concat(Object)
  • Insert(Int32, String)
  • Join(String, String[])
  • Replace(Char, Char)
  • Split(Char[])
  • Substring(Int32)
  • Trim(Char[])

Как удалить string c

Здравствуйте, Аноним, Вы писали:

А>Как удалить последний символ из std::string?
К примеру так,

if (!s.empty()) s.erase( s.end() - 1 );

С уважением, Александр
Re: Удаление из std::string

От: achp
Дата: 02.08.07 15:52
Оценка: +1

Здравствуйте, Аноним, Вы писали:

А>Как удалить последний символ из std::string?

s.resize(s.size() - 1);

Re[2]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 10:16
Оценка:

Здравствуйте, Smal, Вы писали:

S>Здравствуйте, Аноним, Вы писали:

А>>Как удалить последний символ из std::string?
S>К примеру так,

S>

S>if (!s.empty()) S> s.erase( s.end() - 1 ); S>
S>if (!s.empty()) S> s.erase( s.rbegin() ); S>

Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[3]: Удаление из std::string

От: Bell
Дата: 03.08.07 11:11
Оценка: +1

Здравствуйте, dr.Chaos, Вы писали:

DC>Тогда может?

S>>

S>>if (!s.empty()) S>> s.erase( s.rbegin() ); S>>

Не существует перегрузки erase для reverse_iterator.

Любите книгу — источник знаний (с) М.Горький
Re[4]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 11:30
Оценка:

Здравствуйте, Bell, Вы писали:

B>Здравствуйте, dr.Chaos, Вы писали:

DC>>Тогда может?

S>>>

S>>>if (!s.empty()) S>>> s.erase( s.rbegin() ); S>>>

B>Не существует перегрузки erase для reverse_iterator.

Мда, не существует. Посыпаю голову пеплом.

if (!s.empty()) s.erase( s.rbegin().base() );

Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[5]: Удаление из std::string

От: Bell
Дата: 03.08.07 11:39
Оценка:

Здравствуйте, dr.Chaos, Вы писали:

DC>Мда, не существует. Посыпаю голову пеплом.
Ну, не стоит так уж себя казнить

DC>Тогда так :
DC>

DC>if (!s.empty()) DC> s.erase( s.rbegin().base() ); DC>
assert(s.end() == s.rbegin().base());

Любите книгу — источник знаний (с) М.Горький
Re[6]: Удаление из std::string

От: sof.bix http://byterix.net
Дата: 03.08.07 13:06
Оценка:

B>Опять мимо
B>

B>assert(s.end() == s.rbegin().base()); B>
if (!s.empty()) s.erase( (s.rbegin() - 1).base() - 1) );

Re[6]: Удаление из std::string

От: sof.bix http://byterix.net
Дата: 03.08.07 13:11
Оценка:

Здравствуйте, Bell, Вы писали:

B>Опять мимо
B>

B>assert(s.end() == s.rbegin().base()); B>
if (!s.empty()) s.erase( s.rbegin().base() - 1 );

А вообще конец рабочей недели

Re[7]: Удаление из std::string

От: dr.Chaos Украшения HandMade
Дата: 03.08.07 13:17
Оценка: +1

Здравствуйте, sof.bix, Вы писали:

SB>Он имел в виду:

SB>

SB>if (!s.empty()) SB> s.erase( s.rbegin().base() - 1 ); SB>

SB>А вообще конец рабочей недели

Нет уж позвольте, я имел ввиду именно то, что написал.

Просто в данном раскладе все равно вычитание надо, от которого я хотел избавится. А вообще erase для reverse_iterator сделать не трудно, но видимо народ решил не парится, т.к. вроде не нужно, хотя это могло бы уменьшить количество потенциальных ошибок, при приведении от reverse_iterator к iterator особенно на границах .

Удаление определенных символов из строки

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

Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
задан 10 июл 2020 в 18:22
Александр II Александр II
95 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

эффективнее решить задачу можно с использованием идиомы erase-remove:

 std::string a = "agaga"; a.erase(std::remove(a.begin(), a.end(), 'a'), a.end()); std::cout  

обьяснение: remove смещает элементы не равные 'a' в начало строки в том же порядке в каком они были изначально, потом возвращает итератор на первый элемент равный 'a' (эти элементы лежат в хвосте строки), и затем erase затирает ненужные элементы от начала этого итератора и до конца

Как в строке удалить ненужный символ и при этом сократить саму строку?

Есть строка, в ней нужно удалить символ таким образом, чтобы остальная строка осталась и размер строки (то есть массива символов), уменьшился. Я использовал calloc для выделения памяти, но не могу додуматься, как при помощи того же realloc сжать строку.

#include #include #include #include #define _CRT_SECURE_NO_WARNINGS // от ошибки #pragma warning(disable : 4996) int main() < char* ss; int n; system("chcp 1251");// переходим в консоли на русский язык system("cls");// очищаем окно консоли printf("Введите длину строки: "); scanf("%d", &n); ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку gets(ss); printf("Введите свое слово (не забываем про длину строки): "); scanf("%s", ss); for (int i = 0; i < n; i++) < if (ss[i] != NULL) // проверка на нулевой указатель < if (ss[i] == '*') // тот самый символ, который мы ищем < for (int j = 0; ss[j] != '\0'; j++) < ss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец >> > else < printf("Error. Exit"); exit(1); >> for (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер < if (ss[i] == '\0') < ss = (char*)realloc(i, sizeof(char*)); gets(ss); >else break; > free(ss); return 0; >
  • Вопрос задан более двух лет назад
  • 243 просмотра

Комментировать
Решения вопроса 0
Ответы на вопрос 2

CityCat4

Внимание! Изменился адрес почты!
Минутку, я кажется когда-то такую задачу решал. Вот.

/*------------------------------------------------------------------------- Unescape string againts some character Call: void strunescape(char *source, char symbol); Args: source - source string, is subject to change! symbol - unescaping symbol Source string MUST be finished by \0'. -------------------------------------------------------------------------*/ #include "make.h" // Main function void strunescape(char *source, char symbol)

Смысл в чем - при уменьшении строки ты ее просто дергаешь к голове в той же самой области памяти. И так до тех пор, пока все вхождения symbol не будут обнаружены.

Ответ написан более двух лет назад
Константин @MKaffein Автор вопроса
тут такая ситуация что нужно использовать именно те инструменты, что я и использовал,

bingo347

CityCat4, мне кажется, что многократный memmove всего хвоста строки, будет шибко медленнее, чем передвигать по 1 символу на количество вырезанных символов.

CityCat4

Константин, Не понял - нельзя использовать memmove? Нужно написать именно циклом? Ну замените memmove собственной реализацией 🙂 делов-то.

CityCat4

Дмитрий Беляев, Может быть. Но откуда Вы знаете сколько в строке удаляемых символов и где они расположены? Нужно тогда будет сначала просканировать строку, при этом запоминая позиции символов, потом начать цикл сдвига, учитывая тот факт, что для символа N[1] нужно сдвигать на 1, для символаN[2] - на два и т.д.
Вырастает довольно сложный алгоритм. Да, возможно он будет быстрее - если его отладить. Но мне то, что сделано показалось достаточной реализацией, тем более, что строки длиной в тысячи символов я двигать вовсе не собирался 🙂

bingo347

CityCat4, можно по ходу дела считать удаляемые символы и сразу сдвигать последующие на количество удаленных символов

CityCat4

Дмитрий Беляев, эээ.. все последующие? А как сдвигать-то, если символы раскиданы по строке случайно? Если не лениво, код напиши, потому что так трудно обсуждать 🙂

bingo347

CityCat4, что-то типа такого:

int n = strlen(ss) + 1; // + 1 чтобы включить '\0' int r = 0; for (int i = 0; i < n; i++) < if (ss[i] == '*') < r++; >else if (r != 0) < ss[i - r] = ss[i]; >>

bingo347

Crazy on performance.

ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку

Здесь Вы выделяете гораздо больше байт, чем Вам нужно, sizeof(char*) будет равен 8 на 64 битных архитектурах, когда sizeof(char) - 1. Но при этом стоит не забывать про место под '\0' в конце строки.

gets(ss); printf("Введите свое слово (не забываем про длину строки): "); scanf("%s", ss);
ss = (char*)realloc(i, sizeof(char*)); gets(ss);

Почитайте, что делает функция gets . Опять же проблема с размерами символа. Ну и у realloc несколько другая сигнатура. И вообще realloc достаточно недешевая операция, не за чем ее делать в цикле много раз над одним указателем, достаточно 1 раз в конце.

if (ss[i] != NULL) // проверка на нулевой указатель

Проверку на NULL нужно делать сразу после аллокации памяти. А вот в цикле ее делать незачем.

ss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец

Операция j++ меняет j .

for (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер

Операция sizeof(ss) даст размер char* , то есть размер указателя, что соответствует 8 на 64 битных архитектурах. Для вычисления длины строки (терминированной символом '\0' ) есть функция strlen . А в данном случае вообще можно посчитать количество удаленных символов и из него вычислить длину результирующей строки, что будет дешевле.

Ну и по самому алгоритму. Все можно сделать за 1 проход, подсчетом удаляемых символов и перемещением текущего символа на количество удаленных символов назад.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *