Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2020, 08:32   #1
justmuve
 
Регистрация: 16.12.2014
Сообщений: 4
По умолчанию Удалить слово из строки

Задано предложение и слово. Удалить из предложения k-ое вхождение слова в него. Если такого вхождения нет, то удалить последнее вхождение.
вот на этом у меня ступор произошел
Screenshot_3.jpg
Код:
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <string.h>

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;
}
justmuve вне форума Ответить с цитированием
Старый 02.06.2020, 09:37   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 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; <- тут обнулили указатель
                                // тут надо определиться что вы хотите делать когда нашли индекс слова.
                                // break или continue
|| а если надо сделать пустым то str3[0]=0;
			}
		}
		strcat(temp, str3); <- а тут пытаетесь работать с пустым указателем. Вот и ошибка
		strcat(temp, " ");
		str3 = strtok(NULL, " ");
	}

Вот так чего то там удаляет:

Код:
#define _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <stdio.h>

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 вне форума Ответить с цитированием
Старый 02.06.2020, 11:02   #3
justmuve
 
Регистрация: 16.12.2014
Сообщений: 4
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Вот так чего то там удаляет:
вот теперь работает, спасибо за помощь
Код:
memset(str1, 0, 160);
memset(temp, 0, 160);
memset(str2, 0, 160);
memset(temp1, 0, 160);
и вопросик один, а почему лучше их чистить?
justmuve вне форума Ответить с цитированием
Старый 02.06.2020, 11:12   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 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 вне форума Ответить с цитированием
Старый 02.06.2020, 12:10   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
И чтобы не получать неожиданных результатов работы для каждой переменной нужна своя инициализация. Правило хорошего тона.
И надеяться, что это сделает операционная система при запуске ехе-шника - не сто'ит. Сегодня, может, прокатит, а завтра - х.з.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить слово из середины строки ЛюсиЛью Помощь студентам 7 23.01.2019 13:20
Удалить слово из строки leekav Помощь студентам 1 29.05.2012 00:59
[C] Удалить из строки самое длинное слово onewho Помощь студентам 2 29.09.2010 20:32
Как удалить слово из строки? Ellita Общие вопросы C/C++ 7 19.09.2007 15:43