Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Удаление пробелов в строках


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

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));
 
Я знаю про существование функций, но в данном случае мне нужна процедура.

Автор: volatile 24.9.2011, 23:03
Цитата(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/e94e402e1f106d8b35759232140c62c0

Автор: Lacoste1024 25.9.2011, 08:18
Спасибо большое!) В параметрах процедуры не указывал знак "*". Поэтому и не работало

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

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

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

Автор: borisbn 26.9.2011, 09:15
хммм. был неправ. вспылил. думал это - 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.

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

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

Автор: volatile 27.9.2011, 00:58
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)