В C, пытаясь удалить лишние пробелы в char * и заменить только один пробел между словами - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь удалить ненужные пробелы из моего символа * для дальнейшего использования. По сути, я хочу, чтобы между словами был только один пробел, а между словами - удалить любые дополнительные пробелы, символы табуляции или символы новой строки. Я верю, что текущий код, который у меня есть, почти работает, но я не могу прочитать память отдельных символов, которые я храню в своем массиве. Также любое решение не должно иметь максимальный размер символа, поэтому, если необходимо динамическое распределение памяти c, это также необходимо учитывать. Есть ли способ заставить это работать? Спасибо

РЕДАКТИРОВАТЬ 1: завершающие и начальные пробелы также должны быть удалены. Спасибо @Vlad из Москвы за разъяснения


int main()
{
    char* fileString1;
    fileString1=removeAdditionalWhiteSpace(fileString1);
}
char* removeAdditionalWhiteSpace(char* wordList) 
{
    char characterHolder;
    char* finalList[strlen(wordList)];
    char* delimeter = wordList;
    int i = 0;
    do 
    {
        finalList[i] += characterHolder;
        char* hasSpace = NULL;
        while (*delimeter == ' ' || *delimeter == '\n' || *delimeter == '\t')
        {
            if(*delimeter == ' ')
            {
                if(hasSpace==NULL)
                {
                    hasSpace = delimeter;
                    characterHolder = *delimeter;                           
                }
                else
                {
                    ++delimeter;
                }
            }
            else if(*delimeter == '\n' || *delimeter == '\t')
            {
                *delimeter = ' ';
                if(hasSpace==NULL)
                {
                    hasSpace = delimeter; 
                    characterHolder = *delimeter;                          
                }
                else
                {
                    ++delimeter;
                }
            }
        }
        hasSpace=NULL;
        characterHolder = *delimeter; 
        i++;      
    } 
    while( (*wordList++ = *delimeter++) );
    return *finalList;
}

Ответы [ 3 ]

1 голос
/ 16 января 2020

Ваша функция не имеет смысла и имеет неопределенное поведение.

Например, переменная characterHolder не была инициализирована и добавлена ​​в указатель finalList[i]

char characterHolder;                 // <===
char* finalList[strlen(wordList)];
char* delimeter = wordList;
int i = 0;
do 
{
    finalList[i] += characterHolder;  // <===
    //….

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

#include <stdio.h>
#include <ctype.h>

char * remove_duplicate_spaces( char *s )
{
    char *src = s, *dsn = s;

    while ( isspace( ( unsigned char )*src ) ) ++src;

    do
    {
        char c = *src;

        if ( isspace( ( unsigned char )c ) ) c = ' ';

        if ( c == ' ' )
        {
            while ( isspace( ( unsigned char ) *++src ) );
            if ( *src )
            {
                *dsn++ = c;
            }
        }

        *dsn++ = *src;
    } while ( *src++ );

    return s;
}

int main(void) 
{
    char s[] = "\t\tIt is\t\ta      very\nlong\nstring.\t\t";

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

    printf( "\"%s\"\n", remove_duplicate_spaces( s ) );

    return 0;
}

Выходные данные

"       It is       a      very
long
string.     "
"It is a very long string."
0 голосов
/ 16 января 2020

Minimalisti c подход:


size_t delspaces(char * str)
{
size_t src, dst;
size_t cnt;

for (cnt=src=dst=0; str[dst] = str[src++]; ) {
        if (isspace(str[dst])) {
                if (dst && !cnt++) str[dst++] = ' '
                continue;
                }
        cnt=0;
        dst++;
        }

        // remove trailing spaces
while (dst && isspace(str[dst-1])) str[--dst] = 0;

        // return the string length of the resulting string
        // (which could be useful for the caller)
return dst;
}

Последнее примечание: последний while() может быть if(), поскольку может быть только один пробел.

0 голосов
/ 16 января 2020

Человек, который выглядит очень сложным.

Вот простая функция для удаления пробелов из строки:
" This is a test \t of some \n Extra white space. "

#include <stdio.h>
#include <ctype.h>

void removeWS(char* text)
{
    char* d = text;

    while (isspace(*text)) ++text;

    while(*text)
    {
        *d = isspace(*text)? ' ' : *text;
        text++;
        while (isspace(*d) && isspace(*text)) ++text;
        if (*text) d++;
    }

    *d = *text;
}


int main(void) {
    char text[] = "  This   is a test  \t of some   \n Extra white  space.  ";

    removeWS(text);
    printf("%s\n", text);

    return 0;
}

Пример вывода:

Success #stdin #stdout 0s 4284KB
This is a test of some Extra white space.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...