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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2013, 01:13   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Строки си

Дана строка, содержащая текст на русском языке. В предложении некоторые слова записаны подряд несколько раз. Получить в новой строке отредактированный текст, в котором удалены подряд идущие вхождения слов в предложениях.

Вот что имеется.

Код:
#include "stdio.h"
#include <conio.h>
#include "string.h"
#include "ctype.h"
#include "windows.h"

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	
	
	char str[200];
	char *p[255];
	char  main_str[255]="";
	int k=0;
	int i=0;
	int flag=0;

	printf("Введите текст на русском языке, где символ '/' - конец предложения.\n\n");

	//Проверка на англ. текст  и пробелы
	do
	{
	gets(str);
	for(i=0;i<strlen(str);i++)
	{
		if(str[i]>='a' || str[i]>='A')
		{
			printf("Неверно введена строка. Входными данными должна быть строка на русском языке!\n");
			break;
		}
		if(!strcmp(str, "\0"))
		{
			printf("Строка не может быть пустой! Повторите ввод!");
			break;
		}
		if(str[i]!=' ')
		{
			break;
		}
		k++;
	}
	}while(str[i]>='a' || str[i]>='A');


	p[i++]=strtok(str, " ,.-");
	while(p[i-1]!=NULL)
	{
		p[i++]=strtok(NULL, " ,.-");
	}
	

	for(int z=0;z<i-1;z++)
	{
    if(p[z+1]!='\0')
	{
	if(strcmp(p[z],p[z+1]) == 0)
	{
		if(z<1)
		{
		strcat(main_str, p[z+1]);
		}
		flag=1;
	}
	else
	{
		if(z<1)
		{
		strcat(main_str, p[z]);
		}
		strcat(main_str, " ");
		strcat(main_str, p[z+1]);
		
		flag=1;
	}
	}
	}
	

	if(flag==1)
	{
	printf("\n%s", main_str);
	}

	getch();
}
Теперь вопросы:
1)При входной строке "пробел строка" - программа крашится. Как лечить?
2)Как сделать, чтобы не учитывался регистр букв при сравнении 2 слов? stricmp пробовал, но он рандомно работает у меня)
3)Как сохранить знаки препинания в выходной строке? После strtok они исчезают безвозвратно.
Praud вне форума Ответить с цитированием
Старый 11.12.2013, 01:36   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

1) проверять вtрнувшуюся из strtok строку на длину больше 0
2) привести входную строку к единообразному регистру и уже потом отправлять в strtok.
3) Сохранять исходную строку в отдельный буфер. А в strtok отправлять копию. Потому как strtok() модифицирует передаваемую строку, заменяя токены на нулевые символы.
Smogg вне форума Ответить с цитированием
Старый 11.12.2013, 02:11   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
1) проверять вtрнувшуюся из strtok строку на длину больше 0
2) привести входную строку к единообразному регистру и уже потом отправлять в strtok.
3) Сохранять исходную строку в отдельный буфер. А в strtok отправлять копию. Потому как strtok() модифицирует передаваемую строку, заменяя токены на нулевые символы.

1)второе слово не понял, но предположил, что надо проверять все p[i]. Не помогло, может что-то не то делаю.
2)Каким образом это сделать и как потом вывести с вводимым регистром?
3)Как мне потом с этим работать? Я то изменяю строку. Соответственно знаки переносятся, что мне даст сохраненная исходная строка?
Praud вне форума Ответить с цитированием
Старый 11.12.2013, 02:49   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

1)быгык) странно, что вообще работало. Вы i не обнуляете:
Код:
p[i++]=strtok(str, " ,.-");
while(p[i-1]!=NULL)
{
	p[i++]=strtok(NULL, " ,.-");
}
2) открываете ASCII таблицу кодировки 1251. И делаете перевод по кодам символов.
3) через strtok вы можете получить смещение от начала строки получившегося слова ( т.е. p-начальный вычесть р-итый). проверяете слово на повторение, и если повтор, то в изначальной строке по данному смещению на длину повторяющегося слова сохраняете какой-нить невозможный символ (их там в начале ASCII-таблицы более чем достаточно).
После окончания разбора конструируете возвращаемую строку, посимвольно копируя исходную, пропуская "невозможные".
Smogg вне форума Ответить с цитированием
Старый 11.12.2013, 03:24   #5
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
1)быгык) странно, что вообще работало. Вы i не обнуляете:
Код:
p[i++]=strtok(str, " ,.-");
while(p[i-1]!=NULL)
{
	p[i++]=strtok(NULL, " ,.-");
}
2) открываете ASCII таблицу кодировки 1251. И делаете перевод по кодам символов.
3) через strtok вы можете получить смещение от начала строки получившегося слова ( т.е. p-начальный вычесть р-итый). проверяете слово на повторение, и если повтор, то в изначальной строке по данному смещению на длину повторяющегося слова сохраняете какой-нить невозможный символ (их там в начале ASCII-таблицы более чем достаточно).
После окончания разбора конструируете возвращаемую строку, посимвольно копируя исходную, пропуская "невозможные".
С первым разобрался)
Можете привести код, как сохранять эти знаки, я что-то не могу переварить эту информацию.
И еще такой вопрос появился.

Если у меня строка - галя галя/ галя. У меня на выходе все те же гали) а должно получиться галя/ галя. Тут нужна скорее всего проверка типа
"Если токен равен токену + '/', то ..., а как это написать?
Praud вне форума Ответить с цитированием
Старый 11.12.2013, 03:49   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Praud Посмотреть сообщение
Можете привести код, как сохранять эти знаки, я что-то не могу переварить эту информацию.
В смысле?
Цитата:
Если у меня строка - галя галя/ галя. У меня на выходе все те же гали) а должно получиться галя/ галя. Тут нужна скорее всего проверка типа
"Если токен равен токену + '/', то ..., а как это написать?
И тут мы подходим к тому, что разделителем предложений желательно должен быть не искусственный '/', а банальная точка, воскл. и вопр. знаки. Т.е. сначала нужно делить входную строку по токенам ".!?".
Получаем массив предложений. И теперь в каждом предложении отдельно ищем повторы. Т.е. набор токенов (или тех символов, которые strtok() заменяет нулем) должен быть стать таким" ,".

Последний раз редактировалось Smogg; 11.12.2013 в 05:04.
Smogg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на строки. Даны две строки. Определить можно ли из символов первой строки получить вторую строку.( написать подпрограммой и ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 5 09.02.2013 14:07
Программа на языке "Ассемблер" - ввод строки, анализ длины строки, добавление точки в конец строки Алексей_2012 Помощь студентам 1 05.04.2012 11:26
Сделать в гриде строки выше, чтобы не растягивать строки до бесконечности kris__tina БД в Delphi 1 09.06.2011 15:31
Создание пустой строки и копирование в неё содержимое предыдущей строки Gvaridos Microsoft Office Excel 2 29.10.2010 13:33
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10