Как удалить слово из строки c
Задано предложение и слово. Удалить из предложения k-ое вхождение слова в него. Если такого вхождения нет, то удалить последнее вхождение.
вот на этом у меня ступор произошел
Screenshot_3.jpg
#define _CRT_SECURE_NO_DEPRECATE #include #include int main(int argc, char *argv[]) < char str1[160], temp[160], str2[160], temp1[160]; printf("Vvedite predlojenie: "); gets(str1); printf("Vvedite slovo: "); gets(str2); char *str3 = strtok(str1, " "); int k = 0, l = 0; printf("Vvedite # vhojdenia: "); scanf("%d", &k); int nom = 0; while (str3) < int t = (strcmp(str3, str2)); if (t == 0) < nom++; l = nom; if (nom == k) str3 = ""; >strcat(temp, str3); strcat(temp, " "); str3 = strtok(NULL, " "); > if (nom != k) < char *str4 = strtok(temp, " "); while (str4) < int t = (strcmp(str4, str2)); if (t == 0) < l = 0; l++; if (l == nom) < str4 = ""; >> strcat(temp1, str4); strcat(temp1, " "); str4 = strtok(NULL, " "); > > printf("Rezultat: "); if (l == k) puts(temp); else puts(temp1); return 0; >
Регистрация: 25.08.2011
Сообщений: 2,841
А чего прям ступор то.
Во первых вот так
str4 = "";
делать низя. Это же указатель на память.
Лучше вот так:
str4 = NULL;
Перед использованием переменные лучше чистить.
memset(str1, 0, 160); memset(temp, 0, 160); memset(str2, 0, 160); memset(temp1, 0, 160);
while (str3) < int t = (strcmp(str3, str2)); if (t == 0) < nom++; l = nom; if (nom == k) < str3 = NULL; > strcat(temp, str3);
Вот так чего то там удаляет:
#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include int main(int argc, char *argv[]) < char str1[160], temp[160], str2[160], temp1[160]; memset(str1, 0, 160); memset(temp, 0, 160); memset(str2, 0, 160); memset(temp1, 0, 160); printf("Vvedite predlojenie: "); gets_s(str1); printf("Vvedite slovo: "); gets_s(str2); char *str3 = strtok(str1, " "); int k = 0, l = 0; printf("Vvedite # vhojdenia: "); scanf("%d", &k); int nom = 0; while (str3) < int t = (strcmp(str3, str2)); if (t == 0) < nom++; l = nom; if (nom == k) < str3[0]=0; >> strcat(temp, str3); strcat(temp, " "); str3 = strtok(NULL, " "); > if (nom != k) < char *str4 = strtok(temp, " "); while (str4) < int t = (strcmp(str4, str2)); if (t == 0) < l = 0; l++; if (l == nom) < str4[0] = 0; >> strcat(temp1, str4); strcat(temp1, " "); str4 = strtok(NULL, " "); > > printf("Rezultat: "); if (l == k) puts(temp); else puts(temp1); getchar(); return 0; >
Skype — wmaster_s E-Mail — WorldMasters@gmail.com
Работаем по 3 критериям — быстро, качественно, недорого. Заказчик выбирает любые два.
Последний раз редактировалось WorldMaster; 02.06.2020 в 09:41 .
| WorldMaster |
| Посмотреть профиль |
| Найти ещё сообщения от WorldMaster |
Регистрация: 16.12.2014
Сообщений: 4
Сообщение от WorldMaster
Вот так чего то там удаляет:
вот теперь работает, спасибо за помощь
memset(str1, 0, 160); memset(temp, 0, 160); memset(str2, 0, 160); memset(temp1, 0, 160);
и вопросик один, а почему лучше их чистить?
Регистрация: 25.08.2011
Сообщений: 2,841
Сообщение от justmuve
вот теперь работает, спасибо за помощь
memset(str1, 0, 160); memset(temp, 0, 160); memset(str2, 0, 160); memset(temp1, 0, 160);
и вопросик один, а почему лучше их чистить?
На эту темы есть старый анекдот:
Буратино в магазине купил 5 яблок.
Затем пошел в другой магазин и купил еще 3 яблока.
Сколько яблок теперь у буратино??
Ответ: Сколько угодно, потому что никто не знает сколько до этого у него было яблок.
В С вам просто выделен кусок памяти. Что в нем может лежать никому никогда не будет известно. И чтобы не получать неожиданных результатов работы для каждой переменной нужна своя инициализация. Правило хорошего тона.
Skype — wmaster_s E-Mail — WorldMasters@gmail.com
Работаем по 3 критериям — быстро, качественно, недорого. Заказчик выбирает любые два.
| WorldMaster |
| Посмотреть профиль |
| Найти ещё сообщения от WorldMaster |
С++. Строки. Удаление слов. Лаба!
Прошу решить задачу. Срочно к завтрашнему дню очь надо. Я бы и сам решил, но забыл учебник, а без него. 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());
Как удалить слово из строки c
Регистрация: 27.03.2018
Сообщений: 21
В символьной строке удалить все слова, которые содержат буквы, не входящие в разрешенный набор символов.
Задание:В символьной строке удалить все слова, которые содержат буквы, не входящие в
разрешенный набор символов.
разрешённый набор: ‘a’ , ‘A’ , ‘H’ ,’h’ , ‘c’.
ограничения:слово-это только буквы, в нём не должно быть цифр и др. символов кроме букв.
я не знаю какое условие использовать для ограничения, написал что разделители всё кроме слов и поставить вместо них пробел,но что-то не выходит.
подскажите в чём ошибка или как сделать иначе,спасибо.
#include #include // определение символических констант #define YES 1 #define NO 0 #define MAXLINE 1000 int main() < char line[MAXLINE]; char *line_ptr; // указатель на текущий символ буфера char *end; // указатель на конец слова char *begin; // указатель на начало слова char c; // текущий символ int flag; // признак слова int found; // признак того, что запрещённые буквы присутстувют в слове char *src; char *dst; flag = NO; found = NO; line_ptr = line; begin = line; end = line; printf("String:"); if ( !fgets(line, sizeof(line), stdin) ) // прочитать строку, если неудачно - выход с ошибкой exit(1); if ( *line == '\n' ) //если строка пустая - на выход exit(0); // цикл чтения символов из строки do < c = *line_ptr; // взять текущий символ из массива if ( (c'z') && (c'Z') ) //проверка на разделители < *line_ptr=' ';//т.к. нам не нужны лишние символы заменяем их на пробел if( flag == YES ) < // найден разделитель end = line_ptr - 1; // запомнить указатель на конец слова if( found == YES ) < //найдены запрещённые буквы слово нужно удалить *src = *end + 1; *dst = *begin; while( (*dst++ = *src++ ) != '\0' );//удаление слова line_ptr = begin; // начать обработку строки сперенесённого фрагмента >> flag = NO; > else < //найдена буква if( flag == NO ) begin = line_ptr; // запомнить указатель на начало слова if( c != 'a' && c != 'A' && c != 'H' && c != 'h' && c != 'c' ) //проверка на наличие разрешённых букв в слове < found = YES; flag = YES; >else found=NO; > line_ptr++; // продвинуть вперёд указатель на текущий символ > while( c != '\0' ); printf("Result: "); puts(line); return 0; >
Удаление слов из строки
Добрый день)) Уже второй день пытаюсь написать эту программку, но у меня ничего не получается((( Помогите пожалуйста. Есть условие, которое находит самое длинное слово в предложение. Теперь необходимо удалить слова, которые состоят из латинских букв. (нельзя использовать 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; >