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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 15:17   #1
dronchik2010
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 37
По умолчанию Удаление двойных пробелов

Условие:

Написать программу, которая бы в произвольной строке (не более 80 символов) удаляла двойные пробелы и определяла длину новой строки.

Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{
 int i,j;
 char *st;
 clrscr();

 printf("vvod stroki \n");
 gets(st);

 for(i=0;i<=strlen(st);i++)
 if((st[i]==' ') && (st[i+1]==' ') && (st[i+2]==' ') )
  {for(j=i;j<=strlen(st);j++)
    st[j]=st[j+3];
    i=i-3;}

 printf("\n");
 puts(st);
 printf("dlina = %d",strlen(st));

 getch();
}
нужно написать поподробнее с комментариями
особенно в цикле




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 08.12.2011 в 16:43.
dronchik2010 вне форума Ответить с цитированием
Старый 08.12.2011, 15:24   #2
Демик
Форумчанин
 
Аватар для Демик
 
Регистрация: 30.01.2011
Сообщений: 231
По умолчанию

А вы не пробовали быть немного вежливее? Спасибо там, пожалуйста, а?
Если уж хотите помощи то надо об этом просить.
Злостный анимешнег =^.^=
Демик вне форума Ответить с цитированием
Старый 08.12.2011, 16:14   #3
viron
Форумчанин
 
Аватар для viron
 
Регистрация: 02.12.2011
Сообщений: 110
По умолчанию

Вот здесь выход за границы массива
Код:
  for(i=0;i<=strlen(st);i++)
Код:
  for(i=0;i<strlen(st);i++)
Здесь тоже самое
Код:
  for(j=i;j<=strlen(st);j++)
viron вне форума Ответить с цитированием
Старый 08.12.2011, 18:08   #4
viron
Форумчанин
 
Аватар для viron
 
Регистрация: 02.12.2011
Сообщений: 110
По умолчанию

Код:
#include "stdafx.h"
using namespace std;
#include "cstring"

int _tmain(int argc, _TCHAR* argv[])
{
	const int ArrSize = 80;		// максимальная длина строки
	char str[ArrSize] = "";		// здесь будем хранить строку
	int i,j;

	cout << "Enter string:\n";
	cin.getline(str, ArrSize);


	cout << "str = "	<< str	<< ", length = " << strlen(str) << endl;

	// Удалим все лишние пробелы
	for (i=0; i<strlen(str); i++)
		if ( (str[i] == ' ') && (str[i+1] == ' ') )	// два подряд идущих пробела
		{  // передвигаем всю строку влево на 1 символ начиная с позиции str[i+1]
			for (j=i+1; j<strlen(str); j++)
				str[j] = str[j+1];
			i--;  // возвращаемся к предыдущему символу
		}


	cout << "str = "	<< str	<< ", length = " << strlen(str) << endl;

	cin.get();
	cin.get();
	return 0;
}

Последний раз редактировалось viron; 08.12.2011 в 18:11.
viron вне форума Ответить с цитированием
Старый 09.12.2011, 15:20   #5
dronchik2010
Пользователь
 
Регистрация: 20.09.2011
Сообщений: 37
По умолчанию

if((st[i]==' ') && (st[i+1]==' ') && (st[i+2]==' ') )

скажите что делает этот цикл в этой проге?
спасибо заранее!
dronchik2010 вне форума Ответить с цитированием
Старый 09.12.2011, 15:29   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от dronchik2010 Посмотреть сообщение
if((st[i]==' ') && (st[i+1]==' ') && (st[i+2]==' ') )

скажите что делает этот цикл в этой проге?
спасибо заранее!
Это проверка на три, идущих подряд, пробела.
Код:
// Удалим все лишние пробелы
	for (i=0; i<strlen(str); i++)
		if ( (str[i] == ' ') && (str[i+1] == ' ') )	// два подряд идущих пробела
		{  // передвигаем всю строку влево на 1 символ начиная с позиции str[i+1]
			for (j=i+1; j<strlen(str); j++)
				str[j] = str[j+1];
			i--;  // возвращаемся к предыдущему символу
		}
Применение здесь цикла for не совсем корректно, так как строка меняет свою длину. Можно зделать так:

Код:
int k = strlen(str);
int i = 0;
while(i < k)
{
    if ( (str[i] == ' ') && (str[i+1] == ' ') )	// два подряд идущих пробела
    {   
        for (j=i+1; j<strlen(str); j++)
		str[j] = str[j+1];
    k--;
    } 
    else i++;  
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 09.12.2011 в 15:52.
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.12.2011, 16:56   #7
Ezhuk
Форумчанин
 
Регистрация: 09.10.2010
Сообщений: 217
По умолчанию

Код:
int step=0;	
for(int i=0;i<strlen(str);i++){
     str[i]=str[i+step];
     int j=i;
     while ( str[j] == ' ' && str[j+1] == ' ') {++step;++j;}
}
Такой алгоритм побыстрее будет, конечно при 80 символах это не заметно, но при больших текстах еще как заметно будет.
Ёж птица гордая, пока не пнешь не полетит.
Ezhuk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление пробелов Tradua Общие вопросы C/C++ 3 05.05.2011 11:31
Удаление начальных пробелов на С Corpinccom Общие вопросы C/C++ 8 23.07.2010 00:53
Удаление лишних пробелов. qwertytol Общие вопросы C/C++ 5 16.05.2010 15:43
Удаление пробелов на C++ REztor Помощь студентам 1 02.11.2009 20:36
Удаление пробелов Иван 883 Помощь студентам 1 20.04.2009 22:23