Как удалить символ из одномерного массива?
Я только недавно познакомился с массивами, поэтому и вопрос дилетантский. Итак, я разбиваю строку «Hello, World!» на символьный массив, допустим, мне нужно убрать пробел. Я думал использовать Esc-последовательность ‘\b’, но почему-то она затирает 2 символа.
using namespace std; int main() < char arr[13]< 'H','e','l','l', 'o', ',', ' ', 'W', 'o','r', 'l', 'd', '!' >; int i, j; for (i = 0; i < 13; i++) < if (arr[i] == ' ') arr[i] = '\b'; >for (j = 0; j
После этого в консоли получается «HelloWorld!». Не понимаю, почему удалились сразу ‘ ‘ и ‘,’ . Подскажите пожалуйста, как универсально и эффективно затирать символы из массива?
Отслеживать
задан 18 июн 2021 в 14:09
Makar Kosenko Makar Kosenko
27 5 5 бронзовых знаков
Удаление символа из массива

удаление символа из одномерного массива
нужно удалить из одномерного массива заданный элемент. оформить нужно как динамический массив.
Удаление символа из одномерного массива!
Дан одномерный массив, элементы которого — целые числа. Удалите из него все четные числа. #include.
Удаление первого символа элементов массива string
Текст задан строкой string ST, Получить массив слов, удалив из них первую букву. .
Удаление от символа до символа с заданной позиции
Здравствуйте, подскажите как удалить из файла строку от символа до символа с заданной позиции.
Удаление символов из строки
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
Как удалить символ из массива c
Здравствуйте, vim, Вы писали:
vim>есть char* line;
vim>как удалить некоторое количество символов с конца
line[pos] = '\0';
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re: Как удалить символ с конца в символьном массиве
| От: | Кодт |
| Дата: | 22.08.06 16:31 |
| Оценка: |
Здравствуйте, vim, Вы писали:
vim>есть char* line;
vim>как удалить некоторое количество символов с конца
Взять хорошую книжку по Си, тщательно прочитать главу про строки, подумать.
Взять хорошую книжку по С++, сделать то же самое.
Определиться со структурами данных, которые есть и будут в твоей программе.
Иначе ты будешь такие вопросы задавать до бесконечности. Они проистекают, по-видимому, от непонимания основ.
В Си нет примитивного типа «строка», он эмулируется с помощью массива символов — начало массива известно по указателю, а конец — элемент со значением ‘\0’ (он же 0).
Поэтому самый дубовый способ — это
— найти длину строки, l = strlen(p), wcslen(p), _tcslen(p) если строка байтовая, юникодная или tchar’овая соответственно
— отсчитать «некоторое количество» t, новая длина nl = l-t
— пометить соответствующий элемент как концевой p[nl] = 0
Хвост массива становится бесполезным, но никуда из памяти не девается до тех пор, пока ты не выполнишь определённые действия. Это зависит от того, как массив был размещён:
— в статическом или автоматическом хранилище (т.е. локальная или глобальная переменная), а также как член структуры или класса — поменять размер невозможно, да и не нужно
— с помощью malloc() — можно сделать p = realloc(p, (nl+1)*sizeof(*p)) где +1 — учитываем концевой ноль, sizeof(*p) — размер элемента массива (char, WCHAR, wchar_t, TCHAR)
— с помощью new CharType[N] — легального способа нет
— в vector — vec.resize(nl+1)
— в string, wstring — незачем применять дубовый способ
Если же исходный массив трогать нельзя, то дубовый способ номер два — это
— разместить новый массив np размера nl+1
— скопировать туда первые nl элементов строки — strncpy, strcpy_s, lstrcpyn, memcpy, std::copy
— не забыть записать маркер конца np[nl] = 0 (функция lstrcpyn делает это сама)