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

Как удалить слово из строки 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

Как удалить слово из строки 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; > 

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

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