Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление пробелов в строках 
:(
    Опции темы
Lacoste1024
Дата 24.9.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 20.3.2011

Репутация: нет
Всего: 1



Имеются строки. Нужно удалить из них пробелы. Так как строка у меня не одна, для удаления пробелов я использую процедуру
Код

void DeleteSpaces(char str[], int length)
{
    for (int i = 0; i < length; i++)
        if (str[i] == 32) {
            for (j = i; j < length; j++)
                str[j] = str[j+1];
            str[j+1] = '\0';
        }
}

Проблема в том, что я не знаю как сделать так, чтобы процедура удаляла пробелы из входящей строки. Например ниже я написал использование процедуре. И мне надо, чтобы из строки s удалились пробелы
Код

DeleteSpaces(s, strlen(str));
 
Я знаю про существование функций, но в данном случае мне нужна процедура.


Это сообщение отредактировал(а) Lacoste1024 - 24.9.2011, 16:44
PM MAIL   Вверх
volatile
Дата 24.9.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Lacoste1024 @  24.9.2011,  16:41 Найти цитируемый пост)
И мне надо, чтобы из строки s удалились пробелы

Lacoste1024, а что ваша процедура не работает?

В таком случае, позвольте, немного поизвращаться
Код

void DeleteSpaces (char *d)
{
   for  (char *s=d; *d=*s; ++s)
      d += *s!=' ';
}

Тестирование:
http://liveworkspace.org/code/e94e402e1f10...5759232140c62c0
PM MAIL   Вверх
Lacoste1024
Дата 25.9.2011, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 20.3.2011

Репутация: нет
Всего: 1



Спасибо большое!) В параметрах процедуры не указывал знак "*". Поэтому и не работало
PM MAIL   Вверх
borisbn
Дата 26.9.2011, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, красиво, ничего не скажешь, но не факт, что *s!=' ' всегда будет 1. М.б. и 0xFF 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 26.9.2011, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  26.9.2011,  06:24 Найти цитируемый пост)
  не факт, что *s!=' ' всегда будет 1  

borisbn, правда ?!  smile 
а если заглянуть в стандарт ?  smile 


Это сообщение отредактировал(а) mes - 26.9.2011, 08:52


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 26.9.2011, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



хммм. был неправ. вспылил. думал это - implementation defined. посмотрел в стандарте
Цитата

4.7 Integral conversions [conv.integral]
...
If the destination type is bool, see 4.12. If the source type is bool, the value false is converted to zero and the value true is converted to one.



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
math64
Дата 26.9.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно модифицировать так (и IMHO будет немного понятнее):
Код

void DeleteSpaces (char *d)
{
   for  (char *s=d; *d=*s; ++s)
      if(*s!=' ') d++;
}

PM   Вверх
volatile
Дата 27.9.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(math64 @  26.9.2011,  14:28 Найти цитируемый пост)
будет немного понятнее

math64, ну там цель ставилась не сделать понятнее, а 
Цитата(volatile @  24.9.2011,  23:03 Найти цитируемый пост)
немного поизвращаться
 smile 

Вообще там можно много к чему придраться, и в рельных проектах, вообще лучше воздержаться от подобного написания (я имею в виду свой вариант). Потому как сопровождать такой код, весьма проблематично. Например есть риск, что какой-нибудь умник исправит условие выхода из цикла *d=*s, на *d==*s. Или, например, если код проверять анализаторами (тандерболт вспомнился....), то он просто засыпет предупреждениями на таких местах.

Но, если дело дошло уже до крайней оптимизации, где каждый такт на счету, то
Цитата(volatile @  24.9.2011,  23:03 Найти цитируемый пост)
d += *s!=' ';
будет работать быстрее, чем
Цитата(math64 @  26.9.2011,  14:28 Найти цитируемый пост)
if(*s!=' ') d++;

так как if - это всегда условный переход, а условный переход - это риск не угадать в предвыборке команд.
Первый-же вариант - линейная программа без переходов и посему должна работать быстрее. smile 


Это сообщение отредактировал(а) volatile - 27.9.2011, 01:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.