Страница 1 из 4

Функция на C которая удаляет повторяющиеся пробелы из char*

Добавлено: 15 июн 2003, 14:20
Anonymous
У кого-нить есть Функция на C которая удаляет повторяющиеся пробелы из char*???
спасибо!

Добавлено: 15 июн 2003, 22:04
kas
А самому написать слабо?

Добавлено: 16 июн 2003, 00:34
Anonymous
на слабо брать никого не стоит!
есть понятие : "нет времени"

вот пример... (не мой)

int strip_spaces(const char *src, char *dst, int size)
{
int in_space = 0;
int count = size - 1;

if(!src || !dst || (size < 0))
return -1;

while(*src && (count >= 0))
{
if(!in_space)
{
if(*src == ' ')
{
in_space = 1;
}
*dst++ = *src++, --count;
}
else
{
if(*src == ' ')
{
src++;
}
else
{
in_space = 0;
}
}
}
*dst = '\0';
return size - count - 1;
}

Добавлено: 16 июн 2003, 07:17
Llama
такие простыни для таких функций напрочь отбивают у меня желание изучать С...
Может с pcre будет короче?

Добавлено: 16 июн 2003, 08:39
kas
Вот, что я своял на скорую руку(с примером использования)

Код: Выделить всё

#include <stdio.h>
#include <string.h>

char* strip_spaces(const char* in, char* out)
{
  char *p;

  strcpy(out,in);

  while(1)
  {
    p = strchr(out,' ');
    if (p==NULL) break;
    strcpy(p,p+1);
  }
  return out;
}

int main()
{
  char *a  = "ab ra ka da b ra";
  char b[strlen(a)];

  strip_spaces(a,b); 
  printf("%s\n",a);
  printf("%s\n",b);

  return 0;
}

Как видите, получилось значительно короче :D

Добавлено: 16 июн 2003, 10:05
Anonymous
Да короче но не тот результат!
у тебя ф-ция удаляет все пробелы!
а нужно только повторяющиеся...т.е
из строки :

Код: Выделить всё

fdFH   EFEWHF       gghlrg
должно остаться :

Код: Выделить всё

fdFH EFEWHF gghlrg

вот так вот:)

Добавлено: 16 июн 2003, 11:17
kas
Вот, пожалуйста:

Код: Выделить всё

#include <stdio.h>
#include <string.h>

char* strip_spaces(const char* in, char* out)
{
  char *p;

  strcpy(out,in);

  while(1)
  {
    p = strstr(out,"  ");
    if (p==NULL) break;
    strcpy(p+1,p+2);
  }
  return out;
}

int main()
{
  char *a  = "ab   raka   da b r      a";
  char b[strlen(a)];

  strip_spaces(a,b);
  printf("%s\n",a);
  printf("%s\n",b);

  return 0;
}

Добавлено: 16 июн 2003, 11:33
mend0za

Код: Выделить всё

#!/usr/bin/ruby
string.gsub(/ {1,}/,' ')

#!/bin/sh
echo $@|sed 's/  / /g'
ЗЫ: обожаю языковое сектантство, особенно в отношении ассемблера и Cи/C++

Добавлено: 16 июн 2003, 11:36
kas
Что значит "языковое сектанство"?

Добавлено: 16 июн 2003, 11:43
mend0za
когда один или 2 языка считаются "правильными"
а остальные - "типа пусть живут, я сегодня добрый"

Добавлено: 16 июн 2003, 12:34
leikind
[uNIx]mend0za писал(а):

Код: Выделить всё


#!/usr/bin/ruby
string.gsub(/ {1,}/,' ')

#!/bin/sh
echo $@|sed 's/  / /g'
ЗЫ: обожаю языковое сектантство, особенно в отношении ассемблера и Cи/C++
[/code]

Код: Выделить всё

ruby -p -e '$_.gsub!(/ +/," ")'

Код: Выделить всё

perl -p -e 's/ +/ /'

Код: Выделить всё

awk '{gsub(/ +/," "); print}'
;-)

Добавлено: 16 июн 2003, 12:37
mend0za
не ничего более отвратительного, чем обработка текстов в Cи

Pure Bourn Shell:

Код: Выделить всё

#!/bin/sh
for i in $@ 
do
        RESULT="$RESULT $i"
done
echo $RESULT

Добавлено: 16 июн 2003, 13:35
leikind
[uNIx]mend0za писал(а):не ничего более отвратительного, чем обработка текстов в Cи

Pure Bourn Shell:

Код: Выделить всё

#!/bin/sh
for i in $@ 
do
        RESULT="$RESULT $i"
done
echo $RESULT

И еще шелл:

Код: Выделить всё

#!/bin/sh

function strip(){
   while test -n "$1"
   do
      res="$res $1" 
      shift
   done
   echo $res
}

echo `strip "qq    w     ereee    rr"`

Добавлено: 16 июн 2003, 14:19
kas
[uNIx]mend0za писал(а):когда один или 2 языка считаются "правильными"
а остальные - "типа пусть живут, я сегодня добрый"
А здесь что-нибудь об этом было? Я что-то не припомню...

Добавлено: 16 июн 2003, 14:24
mend0za
2 kirya85:
еще раз повторюсь:
обработка текста на Cи - это запущенная форма идиотизма