Как заменить несколько пробелов одним пробелом?

Ну, я ищу функцию, которая уменьшает количество пробелов' ' в строке.

Например для строкиs дано :

s="hello__________world____!"

Функция должна вернуть"hello_world_!"

В Python мы можем сделать это через регулярное выражение просто как:

re.sub("\s+", " ", s);
 Sinan Ünür02 авг. 2009 г., 01:13
Покажите, что вы уже пробовали.
 Ali Mezgani02 авг. 2009 г., 01:35
я подумал о функции, которая может уменьшить мультипространства, но она не работает, может быть для проблемы рекурсии
 Adam Batkin02 авг. 2009 г., 01:15
Что вы сделали до сих пор, чтобы попытаться решить эту проблему?

Ответы на вопрос(6)

Я только изучаю C, поэтому я использую намного более простой код. Я читаю первую главу «Язык программирования Си» и пытался найти ответ на поставленную там задачу.

Вот что я придумал:

#include <stdio.h>

int main()
{
    /* Set two integers:
       c is the character being assessed,
       lastspace is 1 if the lastcharacter was a space*/
    int c, lastspace;
    lastspace = 0;

    /* This while loop will exit if the character is EOF

       The first "If block" is true if the character is not a space,
       and just prints the character
       It also tells us that the lastcharacter was not a space

       The else block will run if the character is a space

       Then the second IF block will run if the last character
       was not also a space (and will print just one space) */

    while((c = getchar()) != EOF){
        if (c != ' '){
            putchar(c);
            lastspace = 0;
        }
        else {
            if (lastspace != 1)
                    putchar(c);
            lastspace = 1;
        }
    }

    return 0;
}

Надеюсь, это поможет! Кроме того, я хорошо знаю, что этот код, возможно, не оптимизирован, но для начинающего, как я, это должно быть просто!

Спасибо фил

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    char word[100];
    gets(word);
    //the word has more than a single space in between the words
    int i=0,l,j;
    l=strlen(word);
    for (i=0;i<l;i++)
    {
        if(word[i]==' '&&word[i+1]==' ')
        {
            for(j=i+1;j<l;j++)
            word[j]=word[j+1];
        }
    }
    puts(word);
    return 0;
}

Этот код очень прост и работает для меня как шарм. Я не знаю, будут ли в этом коде другие проблемы, с которыми я не сталкивался, но пока это работает.

В стандартной библиотеке C такой функции нет. Для этого нужно написать функцию или использовать стороннюю библиотеку.

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

void
simplifyWhitespace(char * dst, const char * src)
{
    for (; *src; ++dst, ++src) {
        *dst = *src;
        if (isspace(*src))
            while (isspace(*(src + 1)))
                ++src;
    }

    *dst = '\0';
}

Другой способ сделать это, чтобы напечатать только первое вхождение пробела, пока не придет следующий символ, вот мое решение для грубой силы.

#include<stdio.h>
typedef int bool;
#define True  1
#define False 0
int main()
{
        int t;
        bool flag = False;

        while ((t = getchar()) != EOF)
                if (t == ' ' && !flag)
                {
                        putchar(' ');
                        flag = True; // flag is true for the first occurence of space
                }

                else if(t == ' '&& flag)
                        continue;
                else
                {
                        putchar(t);
                        flag = False;
                }

        return 0;
}

Надеюсь, поможет.

Решение Вопроса

Версия, которая изменяет строку на месте, запустите ее на копии, если оригинал должен быть сохранен:

void compress_spaces(char *str)
{
    char *dst = str;

    for (; *str; ++str) {
        *dst++ = *str;

        if (isspace(*str)) {
            do ++str; 

            while (isspace(*str));

            --str;
        }
    }

    *dst = 0;
}
 20 апр. 2012 г., 20:41
У меня работает на ваш вклад. Я не понимаю, что вы подразумеваете под "получить 0 выходных данных". Я утверждаю, что вы не правы. ;-)
 21 апр. 2012 г., 17:45
Когда я скомпилирую это утверждение и введу char *, он удалит все элементы, мой вклад был & quot; Пусто как-то & quot; и результат был & quot; так буквально пусто, я был бы рад, если вы скажете мне, что я делаю неправильно :-)
 16 апр. 2012 г., 10:03
Я выполнил эту функцию, но если я вставлю & quot; Пусто как-то & quot; я получу 0 выходных! Я утверждаю, что это не делает то, что должен делать ...
 07 мая 2014 г., 18:08
@ Идеально, как ты это делаешь?++str, Это так же, какstr++ в этой ситуации?
void remove_more_than_one_space(char *dest, char *src)
{
    int i, y;
    assert(dest && src);
    for(i=0, y=0; src[i] != '\0'; i++, y++) {
        if(src[i] == ' ' && src[i+1] == ' ') {
            /* let's skip this copy and reduce the y index*/
            y--;
            continue;
        }
        /* copy normally */
        dest[y] = src[i];
    }
    dest[y] = '\0';
}
int main()
{
    char src[] = "Hello   World   ! !!   !";
    char dest[strlen(src) + 1];
    remove_more_than_one_space(dest, src);

    printf("%s\n", dest);
}

Я только что сделал это, надеюсь, это поможет.

 02 авг. 2009 г., 01:49
Стрлен (SRC) я имею в виду
 02 авг. 2009 г., 01:48
Почему больше? дест должен бытьat least тот же размер срк.
 02 авг. 2009 г., 01:44
Но вызывающая сторона должна быть уверена, что dest указывает на блок, который больше, чем strlen (src), иначе это приведет к загрузке памяти.
 Ali Mezgani02 авг. 2009 г., 02:33
Это сработало. Функция возвращает обрезанную строку, но со специальным символом в конце.
 02 авг. 2009 г., 02:33
@ Лука: Если это должно быть толькоat least strlen(src) тогда почему ваш код идетchar dest[strlen(src) + 1];? ;)

Ваш ответ на вопрос