Удаление символов из строки
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
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.9.2008
Репутация: нет
Всего: нет
Здравствуйте. Помогите пожалуйста выполнить задание, просто я только начал изучать программирование и не могу понять, как реализовать это: Дана строка, содержащая последовательность слов, разделенных пробелами. Необходимо удалить из строки все слова в которых есть заданная буква (строку и букву вводит пользователь). И удалять необходимо только слова в которых есть заданная буква, все остальные слова и пробелы необходимо оставить.
| Дата 13.11.2009, 01:16 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008
Репутация: нет
Всего: 1
ммм код писать лениво.
приведу самое простое решение как мне кажется.
нужно 2 массива строк.
1. считать строку.
2. считать символ.
3. зашли в цикл.
4. выделяем слово
5. ищем в слове букву на совпадение
6. если буква не найденна копируем слово в новую строку(вторую)
7. если строка не кончилась вернись в 4
алгоритм не оптимизированный и я сходу вижу 2 улучшения, но так оно понятнее будет.
если что попробую подробнее обьяснить.
если у вас ограниченна память то есть еще вариант, ненамного сложнее но все же.
Это сообщение отредактировал(а) Enelar — 13.11.2009, 01:17
| Дата 13.11.2009, 05:44 (ссылка) | (голосов:1) Загрузка . |
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.9.2008
Репутация: нет
Всего: нет
Чего-то у меня не получается это реализовать. Сам то алгоритм я понял, но после многих неудачных попыток реализовать его, я уже не могу ничего придумать.
Enelar не мог бы ты написать код. Просто очень надо.
| Дата 13.11.2009, 11:37 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия
Репутация: 1
Всего: 196
Для домашних заданий, курсовых, существует «Центр Помощи».
| Дата 13.11.2009, 18:09 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб
Репутация: 13
Всего: 23
Что-то типа того:
| Код |
| #include |
Это сообщение отредактировал(а) ИванМ — 13.11.2009, 18:23
| Дата 14.11.2009, 02:05 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 10.9.2008
Репутация: нет
Всего: нет
Спасибо всем за помощь!
| Дата 12.10.2022, 22:38 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.10.2022
Репутация: нет
Всего: нет
Модератор: Сообщение скрыто.
| Дата 17.10.2022, 06:30 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль
Репутация: 50
Всего: 88
| Цитата(VivO2714 @ 12.11.2009, 22:42 ) |
| Удаление слов из строки С |
| Код |
| #include #include |
#define DELIM » \t\n»
int main() char buf[BUFSIZ] = «»;
printf( «String: » );
fgets( buf, BUFSIZ, stdin );
printf( «Letter: » );
int ch = getchar();
printf( «Result: » );
for( char * p = strtok( buf, DELIM ); p; p = strtok( NULL, DELIM ) )
if( !strchr( p, ch ) )
printf( «%s «, p );
Это сообщение отредактировал(а) Dov — 17.10.2022, 06:43
Тут вечности запах томительный,
И свежие фрукты дешевые,
А климат у нас – изумительный,
И только соседи – #уевые.
Игорь Губерман.
| Дата 5.11.2022, 11:10 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 34
Регистрация: 4.11.2022
Репутация: нет
Всего: нет
Модератор: Сообщение скрыто.
| Дата 10.12.2022, 03:40 (ссылка) | (нет голосов) Загрузка . |
Профиль
Группа: Участник
Сообщений: 20
Регистрация: 9.12.2022
Репутация: нет
Всего: нет
Модератор: Сообщение скрыто.
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!
- Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
- При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
- В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
- Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
- Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
- Помните: один топик — один вопрос!
- В данном разделе запрещено поднимать темы , т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
- Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
- Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
[ Время генерации скрипта: 0.1737 ] [ Использовано запросов: 21 ] [ GZIP включён ]
С++. Строки. Удаление слов. Лаба!
Прошу решить задачу. Срочно к завтрашнему дню очь надо. Я бы и сам решил, но забыл учебник, а без него. rolleyes:
Из заданной последовательности слов удалить слова, содержащие числа.
9 ответов
25 ноября 2006 года
786 / / 21.10.2006
какие строки? char\std::string\CString(MFC\STL) или чё-то ещё?
25 ноября 2006 года
28 / / 15.11.2006
25 ноября 2006 года
786 / / 21.10.2006
#include
#include
bool word_contains_num(const std::string& word);
int _tmain(int argc, _TCHAR* argv[])
std::string source = «some string with3 a1 few wor4ds cont8aini4ng numbe224rs «;
std::string result = «»;
std::string word;
std::string::size_type src_len = source.length();
std::string::size_type cur_pos = 0;
std::string::size_type space_pos;
while (cur_pos space_pos = source.find(‘ ‘, cur_pos);
if (-1 == space_pos)
space_pos = src_len + 1;
word = source.substr(cur_pos, space_pos — cur_pos);
if (!word_contains_num(word))
result += word + » «;
cur_pos = space_pos + 1;
>
// отрезаем последний пробел в строке. о там обязательно будет,
//если строка не пустая
if (!result.empty())
result = result.substr(0, result.length() — 2);
printf(«Source string: %s\nResult string: %s\n», source.c_str(), result.c_str());
Удаление слов из строки
Добрый день)) Уже второй день пытаюсь написать эту программку, но у меня ничего не получается((( Помогите пожалуйста. Есть условие, которое находит самое длинное слово в предложение. Теперь необходимо удалить слова, которые состоят из латинских букв. (нельзя использовать string и тому подобные)
int main(int argc, char** argv) < setlocale(LC_ALL, "Russian"); char str[80]; cout else < if (count >maxLen) < maxLen = count; index = i - count; >count = 0; > > if (count > maxLen) < maxLen = count; index = i - count; >maxLen += index; printf("\n"); for (i = index; i < maxLen; i++)< //putchar(str[i]); cout printf("\n"); bracket(str);
Вот я что-то пыталась (n-раз) написать, но оно как всегда не работает)
int temp =0; for(int i=0; i < lenght; i++)< if (((str[i]>='a')&&(str[i]<='z'))||((str[i]>='A')&&(str[i] <='Z')))< temp++; >else str[i-temp] = str[i]; lenght-=temp; > cout
Отслеживать
9,066 14 14 серебряных знаков 26 26 бронзовых знаков
задан 1 дек 2016 в 13:36
Даша Новикова Даша Новикова
633 1 1 золотой знак 8 8 серебряных знаков 20 20 бронзовых знаков
а регулярки можно использовать.
1 дек 2016 в 13:51
"нельзя использовать string и тому подобные" -- чему подобные? Поконкретней можно, что именно нельзя использовать?
1 дек 2016 в 13:53
@Alex.B да можно
1 дек 2016 в 14:08
@PinkTux Ну желательно сделать максимально просто, без использования готовых функций
1 дек 2016 в 14:10
Допускаю фразу нельзя использовать без обоснования причин только в вопросах с меткой соревнование.
1 дек 2016 в 14:19
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Я не знаю, что такое "функция string", поэтому вот обе части задания отдельно, с минимальным использованием библиотечных функций. Код немного избыточен для наглядности. При удалении слов (вторая часть) пробелы и знаки препинания остаются на своих местах. Обработка цифр не предусмотрена.
#include #include #include #include int main( void ) < char str[] = "someяяя string with longюю, longest, short and shortest words"; char *s = str; char *longest_ptr = s; size_t longest_len = 0; char *word_ptr; size_t word_len; while( *s ) < /* пропускаем пробелы и знаки препинания */ while( *s && ( isspace( *s ) || ispunct( *s ) ) ) < s++; >/* ищем самое длинное слово */ word_len = 0; word_ptr = s; while( *s && !isspace( *s ) && !ispunct( *s ) ) < s++; word_len++; >if( word_len > longest_len ) < longest_len = word_len; longest_ptr = word_ptr; >> /* выводим самое длинное слово */ printf( "longest word (%zu chars): ", longest_len ); while( longest_len-- ) < putchar( *longest_ptr++ ); >putchar( '\n' ); /* теперь ищем слова с латиницей */ s = str; while( *s ) < while( *s && ( isspace( *s ) || ispunct( *s ) ) ) < s++; >longest_len = 0; /* длина текущего слова */ word_len = 0; /* количество латинских букв в нём */ word_ptr = s; while( *s && !isspace( *s ) && !ispunct( *s ) ) < if( ( *s >= 'a' && *s = 'A' && *s longest_len++; s++; > /* слово только из латиницы, двигаем оставшуюся строку на его место */ if( word_len == longest_len ) < /* * было бы логичней: * memmove( word_ptr, s, strlen( s ) + 1 ); * но раз задание для мазохистов. */ word_len = 0; while( *s ) < word_ptr[word_len++] = *s++; >word_ptr[word_len] = 0; s = word_ptr; > > printf( "string without latin-only words: '%s'\n", str ); return 0; >