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

Как удалить первый символ в строке c

  • автор:

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

K&R (61-62). Приводится пример функции squeeze , которая удаляет все символы c из строки s .

Ниже представлен полный код программы с использованием этой функции. А также ответ к упражнению 2.4, где предлагается написать функцию, удаляющую из строки s1 все символы, встречающиеся в строке s2 .

Алгоритм удаления символа из строки можно описать так:

  • Пока не будет достигнут конец строки,
  • если очередной символ строки не равен символу для удаления,
  • записать очередной символ по месту индекса j , после этого последний увеличить на единицу.

Другими словами, алгоритм сводится к тому, что символ по индексу i затирается следующим символом, если он совпал с символом для удаления; т.к запись идет по счетчику j , а он увеличивается лишь тогда, когда символы из строки и для удаления не совпадают.

Алгоритм удаления тех символов строки, которые встречаются в другой строке, отличается от предыдущего тем, что нужно по очереди извлекать символы из второй строки и удалять их из первой. Т.е. приведенный выше алгоритм следует вложить в цикл перебора символов второй строки.

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

#include #define MAX 100 void squeeze (char s[], int c); main ()  char str0[MAX]; int i, c; for (i = 0; (c = getchar()) != '\n'; i++) str0[i] = c; str0[i] = '\0'; c = getchar(); squeeze (str0, c); printf("%s\n", str0); > void squeeze (char s[], int c)  int i, j; for (i = j = 0; s[i] != '\0'; i++) if (s[i] != c) s[j++] = s[i]; s[j] = '\0'; >

Удаление всех символов, встречающихся в строке s2 , из строки s1

#include #define MAX 100 #define DEL 10 void squeeze (char s[], char s1[]); void written (char s[]); main()  char str[MAX]; char str1[DEL]; written (str); written (str1); squeeze (str, str1); printf("%s\n", str); > void written (char s[100])  int i, c; i = 0; while ((c = getchar()) != '\n')  s[i] = c; ++i; > s[i] = '\0'; > void squeeze (char s[], char s2[])  int k, i, j; for (k = 0; s2[k] != '\0'; k++)  for (i = j = 0; s[i] != '\0'; i++) if (s[i] != s2[k]) s[j++] = s[i]; s[j] = '\0'; > >

Примечание. Во второй программе запись символов в строку выделена в отдельную функцию, т.к. надо записать две строки. Иначе пришлось бы дублировать код.

X Скрыть Наверх

Решение задач на языке C

Обрезка и удаление символов из строк в .NET

Если вы анализируете предложение на отдельные слова, вы можете получить слова с пустыми пробелами (также называемыми пробелами) на обоих концах слова. В этом случае можно использовать один из методов обрезки в System.String классе , чтобы удалить любое количество пробелов или других символов из указанной позиции в строке. В следующей таблице описаны доступные методы обрезки.

Имя метода Использовать
String.Trim Удаление пробелов или знаков, указанных в массиве знаков, из начала и конца строки.
String.TrimEnd Удаление символов, указанных в массиве символов, в конце строки.
String.TrimStart Удаление символов, указанных в массиве символов, в начале строки.
String.Remove Удаление указанного количества символов в указанной позиции индекса в строке.

Trim

Вы можете легко удалить пробелы с обоих концов строки с помощью String.Trim метода , как показано в следующем примере:

String^ MyString = " Big "; Console::WriteLine("HelloWorld!", MyString); String^ TrimString = MyString->Trim(); Console::WriteLine("HelloWorld!", TrimString); // The example displays the following output: // Hello Big World! // HelloBigWorld! 
string MyString = " Big "; Console.WriteLine("HelloWorld!", MyString); string TrimString = MyString.Trim(); Console.WriteLine("HelloWorld!", TrimString); // The example displays the following output: // Hello Big World! // HelloBigWorld! 
Dim MyString As String = " Big " Console.WriteLine("HelloWorld!", MyString) Dim TrimString As String = MyString.Trim() Console.WriteLine("HelloWorld!", TrimString) ' The example displays the following output: ' Hello Big World! ' HelloBigWorld! 

Кроме того, можно удалить символы, указанные в массиве знаков, из начала и конца строки. В следующем примере удаляются пробелы, точки и звездочки:

using System; public class Example < public static void Main() < String header = "* A Short String. *"; Console.WriteLine(header); Console.WriteLine(header.Trim( new Char[] < ' ', '*', '.' >)); > > // The example displays the following output: // * A Short String. * // A Short String 
Module Example Public Sub Main() Dim header As String = "* A Short String. *" Console.WriteLine(header) Console.WriteLine(header.Trim()) End Sub End Module ' The example displays the following output: ' * A Short String. * ' A Short String 

TrimEnd

Метод String.TrimEnd удаляет символы из конца строки, создавая новый строковый объект. Для указания символов, которые следует удалять, в этот метод передается массив символов. Порядок элементов в массиве символов не влияет на операцию обрезки. В случае обнаружения символа, который отсутствует в массиве, операция останавливается.

В следующем примере удаляются последние буквы строки с помощью TrimEnd метода . В этом примере положение символа ‘r’ и символа ‘W’ повернуты обратно, чтобы проиллюстрировать, что порядок символов в массиве не имеет значения. Обратите внимание, что этот код удаляет последнее слово MyString и часть первого.

String^ MyString = "Hello World!"; array^ MyChar = ; String^ NewString = MyString->TrimEnd(MyChar); Console::WriteLine(NewString); 
string MyString = "Hello World!"; char[] MyChar = ; string NewString = MyString.TrimEnd(MyChar); Console.WriteLine(NewString); 
Dim MyString As String = "Hello World!" Dim MyChar() As Char = Dim NewString As String = MyString.TrimEnd(MyChar) Console.WriteLine(NewString) 

Этот код выводит на консоль значение He .

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

String^ MyString = "Hello, World!"; array^ MyChar = ; String^ NewString = MyString->TrimEnd(MyChar); Console::WriteLine(NewString); 
string MyString = "Hello, World!"; char[] MyChar = ; string NewString = MyString.TrimEnd(MyChar); Console.WriteLine(NewString); 
Dim MyString As String = "Hello, World!" Dim MyChar() As Char = Dim NewString As String = MyString.TrimEnd(MyChar) Console.WriteLine(NewString) 

Этот код выводит на консоль значение Hello, .

TrimStart

Метод String.TrimStart аналогичен методу , String.TrimEnd за исключением того, что он создает новую строку путем удаления символов из начала существующего строкового объекта. Массив символов передается методу TrimStart для указания удаляемых символов. Как и в случае с методом TrimEnd , порядок элементов в массиве символов не влияет на операцию обрезки. В случае обнаружения символа, который отсутствует в массиве, операция останавливается.

В следующем примере удаляется первое слово в строке. В этом примере положение символа ‘l’ и символа ‘H’ повернуты обратно, чтобы проиллюстрировать, что порядок символов в массиве не имеет значения.

String^ MyString = "Hello World!"; array^ MyChar = ; String^ NewString = MyString->TrimStart(MyChar); Console::WriteLine(NewString); 
string MyString = "Hello World!"; char[] MyChar = ; string NewString = MyString.TrimStart(MyChar); Console.WriteLine(NewString); 
Dim MyString As String = "Hello World!" Dim MyChar() As Char = Dim NewString As String = MyString.TrimStart(MyChar) Console.WriteLine(NewString) 

Этот код выводит на консоль значение World! .

Удалить

Метод String.Remove удаляет указанное количество знаков, начиная с указанного места в существующей строке. Этот метод подразумевает, что отсчет индекса начинается с нуля.

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

String^ MyString = "Hello Beautiful World!"; Console::WriteLine(MyString->Remove(5,10)); // The example displays the following output: // Hello World! 
string MyString = "Hello Beautiful World!"; Console.WriteLine(MyString.Remove(5,10)); // The example displays the following output: // Hello World! 
Dim MyString As String = "Hello Beautiful World!" Console.WriteLine(MyString.Remove(5, 10)) ' The example displays the following output: ' Hello World! 

Замените

Чтобы удалить из строки указанный символ или подстроку, можно вызвать метод String.Replace(String, String) и указать пустую строку (String.Empty) в качестве замены. В следующем примере удаляются все запятые из строки:

using System; public class Example < public static void Main() < String phrase = "a cold, dark night"; Console.WriteLine("Before: ", phrase); phrase = phrase.Replace(",", ""); Console.WriteLine("After: ", phrase); > > // The example displays the following output: // Before: a cold, dark night // After: a cold dark night 
Module Example Public Sub Main() Dim phrase As String = "a cold, dark night" Console.WriteLine("Before: ", phrase) phrase = phrase.Replace(",", "") Console.WriteLine("After: ", phrase) End Sub End Module ' The example displays the following output: ' Before: a cold, dark night ' After: a cold dark night 

См. также

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

В заданной строке удалить первый символ

Получить строку, начиная со второго символа? Более оптимальное решение:

int sz = strlen(str); memmove(str, str + 1, sz - 1); str[sz - 1] = 0; 

Или поправьте в вашем решении с if (*p != str[0])< на if(p != str)

Ну, а вообще, правильное решение поставленной задачи: char *token = str + 1;

Отслеживать
ответ дан 14 июн 2015 в 7:47
3,034 1 1 золотой знак 20 20 серебряных знаков 48 48 бронзовых знаков
s/memcpy/memmove/, c-faq.com/ansi/memmove.html
14 июн 2015 в 8:23

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

14 июн 2015 в 8:31

Ваш код имеет undefined behavior(неопределённое поведение), о чём Вам и указал @Igor. Поменяйте memcpy на memmove

14 июн 2015 в 8:50

читайте коротенький код

#include using namespace std; int main()

Отслеживать
ответ дан 14 июн 2015 в 7:47
10k 14 14 золотых знаков 53 53 серебряных знака 118 118 бронзовых знаков
я хочу понять принцип работы while
14 июн 2015 в 7:52

если коротко рассказывать то все что заключено в блок while то оно будет повторятся пока его условие истинно (то что в скобках)

14 июн 2015 в 7:57
Спасибо, буду дальше разбираться
14 июн 2015 в 7:59

void F10(char* string) < for (int i = 1; i < strlen(string); i++) < string[i - 1] = string[i]; >string[strlen(string)-1] = 0; > 

Отслеживать
ответ дан 30 мар 2023 в 15:14
1 1 1 бронзовый знак

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

30 мар 2023 в 15:14

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

30 мар 2023 в 16:23
По сути это дубликат почти восьмилетнего ответа от @perfect
30 мар 2023 в 16:36

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как удалить первый символ в строке c

Есть строки разной длины.

Как в строке (string) удалить первые 3 символа?

Регистрация: 28.01.2009
Сообщений: 20,999

Delete(s,1,3);

Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Пепел Феникса
Посмотреть профиль
Найти ещё сообщения от Пепел Феникса

Регистрация: 14.12.2010
Сообщений: 3

program as; uses сrt; var s:string; i:integer; begin clrscr; writeln('vvedite stroky'); read(s); for i:=1 to length(s) do begin delete(s,1,3); end; write(s); readkey; end.

Последний раз редактировалось Stilet; 19.12.2010 в 11:59 .

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Номер символа в строке Veroonya SQL, базы данных 4 24.08.2009 15:04
поиск в строке символа IvanM Assembler — Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 02.06.2009 22:27
В заданной строке символов заменить все первые буквы слов на заглавные NV-salt Общие вопросы C/C++ 4 05.04.2009 18:41
Удаление символа в строке Fantom Общие вопросы Delphi 2 23.06.2008 16:03
Как из строки получить первые три символа experts91 Помощь студентам 2 07.04.2008 21:58

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

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