Удалить первый и последний символ из строки C
у меня есть строка C, которая выглядит как «Nmy stringP» , где N и P могут быть любым символом. Как я могу отредактировать его в «my string» в C?
4 ответов
чтобы «удалить» 1-й символ, укажите на второй символ:
чтобы удалить последний символ, замените его на ‘\0’
другой вариант, опять же предполагая, что «редактировать» означает, что вы хотите изменить на месте:
это изменяет строку на месте, не генерируя новый адрес, как это делает решение pmg. Не то чтобы в ответе pmg было что-то не так, но в некоторых случаях это не то, что вы хотите.
самый эффективный способ:
самый безопасный способ:
второй способ менее эффективен, но он безопаснее, потому что вы можете передавать строковые литералы во вход. Вы также можете использовать strdup для второго способа, Если вы не хотите реализовать его самостоятельно.
далее к ответу @pmg обратите внимание, что вы можете выполнять обе операции в одном операторе:
Это, вероятно, будет работать, как ожидалось, но поведение не определено в стандарте C.
Сокращение и удаление символов из строк в .NET
При разборе предложения на отдельные слова может оказаться, что в начале или в конце некоторых слов стоят пробелы. В этом случае можно воспользоваться методами сокращения в классе System.String, чтобы удалить любое количество пробелов или других символов из указанной позиции в строке. В таблице ниже описаны доступны методы сокращения.
| Имя метода | Использовать |
|---|---|
| String.Trim | Удаление пробелов или знаков, указанных в массиве знаков, из начала и конца строки. |
| String.TrimEnd | Удаление символов, указанных в массиве символов, в конце строки. |
| String.TrimStart | Удаление символов, указанных в массиве символов, в начале строки. |
| String.Remove | Удаление указанного количества символов в указанной позиции индекса в строке. |
Простой способ удалить пробелы с обоих концов строки — метод String.Trim, использование которого показано в следующем примере.
Кроме того, можно удалить символы, указанные в массиве знаков, из начала и конца строки. В следующем примере удаляются символы пробелов, точки и звездочки.
TrimEnd
Метод String.TrimEnd удаляет символы в конце строки, создавая новый строковый объект. Для указания символов, которые следует удалять, в этот метод передается массив символов. Порядок элементов в массиве символов не влияет на выполнение операции сокращения. В случае обнаружения символа, который отсутствует в массиве, операция останавливается.
Ниже приведен пример удаления последних букв строки с помощью метода TrimEnd. В этом примере положение символов ‘r’ и ‘W’ изменено для иллюстрации того, что порядок символов в массиве не имеет значения. Обратите внимание, что этот код удаляет последнее слово MyString и часть первого.
Этот код выводит на консоль значение He .
Ниже приведен пример удаления последнего слова строки с помощью метода TrimEnd. В этом коде после слова Hello следует запятая, а поскольку запятая не указана в массиве символов для сокращения, то выполнение операции прекращается на запятой.
Этот код выводит на консоль значение Hello, .
TrimStart
Метод String.TrimStart аналогичен методу String.TrimEnd за исключением того, что он создает новую строку путем удаления знаков в начале существующего строкового объекта. Для указания символов, которые следует удалять, в метод TrimStart передается массив символов. Как и в случае с методом TrimEnd, порядок элементов в массиве символов не влияет на выполнение операции сокращения. В случае обнаружения символа, который отсутствует в массиве, операция останавливается.
В следующем примере удаляется первое слово в строке. В этом примере положение символов ‘l’ и ‘H’ изменено для иллюстрации того, что порядок символов в массиве не имеет значения.
Этот код выводит на консоль значение World! .
Удалить
Метод String.Remove удаляет указанное количество знаков, начиная с указанного места в существующей строке. Этот метод подразумевает, что отсчет индекса начинается с нуля.
В следующем примере из строки удаляется десять символов, начиная с пятой позиции отсчитываемого от нуля индекса строки.
Как удалить первый символ из C-строки?
Может кто-нибудь мне помочь? Мне нужно удалить первый символ из char * в С.
Например, char * contents содержит ‘\n’ символ как первый символ в массиве. Мне нужно обнаружить и устранить этого символа, изменив исходную переменную после ее «дезинфекции».
Кто-нибудь может мне помочь с кодом? Я совершенно новичок в C и просто не могу понять этого.
Новичку на Си очень полезно прочитать о pointer arithmetic . Погуглите термин, вы получите много совпадений. Это поможет понять, о чем здесь говорят другие. Например: char* contents_chopped = contents + 1; . — biocyberman
7 ответы
Или, если указатель можно изменить:
ах, вот что делают функции ‘mem’ в strings.h круто. Это первое предложение работает отлично! — ясень
и обратите внимание, что вам нужно использовать memmove , Не memcpy , потому как memmove требуется для правильной обработки перекрывающихся источника / назначения. — Дэвид Гелхар
Также обратите внимание, что если вы используете ++ version, то программа выйдет из строя, если вы попытаетесь освободить увеличенный указатель. В этом случае используйте предложение @Grigory. Также на коротких струнах memmove может работать медленнее, чем простой цикл, из-за затрат на его инициализацию. — руслик
char* contents_chopped = contents + 1;
Это приведет к contents_chopped указывающий на ту же строку, за исключением того, что первый символ будет следующим после \ n
Кроме того, этот метод более быстрый.
Следует отметить, что действительность указателя будет зависеть от действительности contents , так что это хорошо, если вы хотите быстро обработать contents_chopped . Также необходимо проверить пустую строку. — TIA
+1 за ответ, который должен использовать любой реальный код. Копирование / перемещение всей строки только для того, чтобы использовать ее хвост, — нелепая трата времени, но, к сожалению, есть много программ, которые действительно делают такие вещи . — R .. GitHub ОСТАНОВИТЬ ПОМОЩЬ ICE
Мне нравится, насколько это просто, но вы не можете освободить contents_chopped, так как ему это нужно. — Дуг Молинью
Не просто увеличивайте указатель, если у вас есть malloc’d какой-либо памяти, иначе ваша программа выйдет из строя. free нужен исходный указатель. Вы можете скопировать указатель, создать новый фрагмент памяти и сохранить его, получить к нему доступ как ptr + 1 или любым другим способом, но люди, которые говорят, что просто увеличивайте указатель, дают вам опасный совет. Вы можете запустить этот пример программы и посмотреть, что произойдет, если вы «просто увеличите указатель».
Подсказка: вот результат:
ответ дан 25 мая ’11, 17:05
Хороший момент, это происходит со мной прямо сейчас, поскольку я использую метод приращения, я также вижу ошибку, аналогичную той, которую вы показываете здесь. Единственная проблема с этим ответом — отсутствие кода. — Дуг Молинью
Похоже, у вас сложилось впечатление, что char * «содержит» символы. Это не. Это просто пунктов at a байт. Подразумевается, что остальная часть строки состоит из следующего байта в памяти до следующего нулевого байта. (Вы также должны знать, что, хотя тип данных ‘char’ является байтом, по определению, на самом деле это не символ — имейте в виду Unicode — и при этом байт не обязательно является октетом.)
Символ * также не является массивом, хотя может существовать такой массив символов, что указатель указывает на начало этого массива.