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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2009, 01:23   #1
SuccEssoR
 
Регистрация: 31.12.2008
Сообщений: 6
По умолчанию Строки(удаление пробелов). C language

Вечер добрый. У меня тут очередная лабораторка и никак не могу добиться нормального результата, фигня какая то выходит.

Задание:

Задана строка типа "_ _ _ Л О Л _ _ _ К Т У Л Х У _ _ _" (где "_" - пробел)

Нужно удалить пробелы перед первым словом во фразе и после последнего и оставить по 1 пробелу между словами, если их больше одного.
Поначалу вроде как выходило, но только если написано всего 2 слова. Больше - глюки.

Вот код:
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

void ReverseWord(char *);
void ReverseSentence(char *);
void DeleteSpaces(char *);
void ReverseNwords(char *);

int main()
{
	char str[200];
	printf("\n\nEnter phrase: ");
	printf("\n\n");
	gets(str);

	//ReverseWord(str);
	//ReverseSentence(str);
	DeleteSpaces(str);
	//ReverseNwords(str);



	getch();
	return 0;

}

void DeleteSpaces(char *str)
{
	int a,b=0, c, len=strlen(str);
	char space=' ', *p;

	for(a=0; a<len; a++)
	 {
		if(str[a]==' ' && str[a+1]==' ' && a!=0)
		 {
		  c=a;
			while(str[c+1]==' ')
			 {
				b++;
				c++;
			 }

			 c=a;

			 while(str[b+c+1]!=' ')
			  {
				 str[c+1]=str[b+c+1];
				 c++;
			  }

			 b=0;
			 c=a;
			 }
      }

      if(a==0 && str[0]==' ')   //  |_ _ _ L O L
      {
          c=0;

          while(str[c]==' ')
          {
              b++;
              c++;
          }

          c=0;

          while(str[b]!=' ')
          {
              str[a]=str[b+a];
              a++;
          }

          c=a;
          b=0;
      }


	printf("%s", str);
}
Функция DeleteSpaces принимает строку и выполняет заданное действие над строкой. Если можно, объясните также, в чем моя ошибка.
SuccEssoR вне форума Ответить с цитированием
Старый 15.01.2009, 02:57   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Пытался искать ошибку, но, видимо, позднее время сказывается )
В общем, переписал по-своему.
Проходит в 3 этапа:
1) Удаление пробелов перед строкой
2) Удаление их в строке
3) Удаление концевых пробелов
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

void ReverseWord(char *);
void ReverseSentence(char *);
void DeleteSpaces(char *);
void ReverseNwords(char *);

int main()
{
	char str[200];
	printf("\n\nEnter phrase: ");
	printf("\n\n");
	gets(str);

	//ReverseWord(str);
	//ReverseSentence(str);
	DeleteSpaces(str);
	//ReverseNwords(str);



	getch();
	return 0;

}

void DeleteSpaces(char *str)
{
	int a,b=0, c, len=strlen(str);
	char space=' ', *p;                     // dumayu, mozhno udalit' )
           a=0;
	while(str[a++]==' ')			// ubiraem probely pered strokoj
		b++;	
	for(a=0; a<len; a++)
	 str[a] = str[a+b];
//---------
 	len = strlen(str);
	for(a=0; a<len; a++)
	{
	  if(str[a]==' ' && str[a+1]==' ')
	   {
		 c = a+1;	
		 b = 0;
		 while(str[c++]==' ') b++;
		 for(c=a+1; c<len; c++)
		  str[c] = str[c+b];
		 len = strlen(str); 		
		}
	 }
	// teper rezhem probely v konce
	a = strlen(str);
	b = 0;
	while(str[a]==' ') a--;
	str[--a] = 0;
printf("%s", str);
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 15.01.2009, 03:09   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Взгляд с трибуны

Такие труды! Разве в Си и Паскале нет аналога операциям

Код:
"Заменить конкатенацию 1 ИЛИ более пробелов И 1 точки на 1 точку И пробел"
а затем
Код:
"Заменить 1 ИЛИ более пробелов на 1 пробел"
?

(А иначе "ушивание" пробелов придётся проводить дважды, что не comme il faut!)

P/s: у меня всё это происходит (при открытии Word) автоматически.

Последний раз редактировалось Sasha_Smirnov; 15.01.2009 в 03:14.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 15.01.2009, 17:08   #4
SuccEssoR
 
Регистрация: 31.12.2008
Сообщений: 6
По умолчанию

Хм, спасибо, Sazary.
Посмотрел как работает программа - все так, только последний символ "съедает", щас гляну, в чем там дело...
SuccEssoR вне форума Ответить с цитированием
Старый 15.01.2009, 17:13   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

SuccEssoR Действительно ) Пардон, не заметил.
Замените в конце
Код:
str[--a] = 0;
на
Код:
	if(str[a-1]==' ') str[--a] = 0;
	else str[a] = 0;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi. Удаление строки. Xeon332 Помощь студентам 18 11.11.2008 15:55
Вставка/удаление из строки. t3ns0r Общие вопросы C/C++ 3 11.10.2008 17:58
Удаление конкретной строки Memo JakSon Общие вопросы Delphi 6 03.03.2008 09:35
Удаление строки из файла Македонский Общие вопросы Delphi 5 29.08.2007 15:40
Полное удаление строки Albenous Общие вопросы Delphi 2 15.01.2007 21:54