Jump to content

Eliminar espaços multiplos de 1 string


Recommended Posts

Posted

Boas a todos  👍

exemplo de string:  space space "ol space  a" space space

a funçao coloca a string da seguinte maneira: "ola"

void middletrim(char *p)
{
     int j=0,i=0,x;
     
     while(p[i]==' '){
                      i++;
                      }
                      
     x=mystrlen(p)-1;
     
     while(p[x]==' '){
                      x--;
                      }
     while(i<x){
                while(p[i]!=' '){
                p[j]=p[i];
                j++;
                i++;
                }
                }
     p[j]='\0';
}

Aceito ajudas  😁 Obrigado  ?

Posted

Tens uma maneira muita simples de fazer isso... alocas uma nova string , mantens um indice j para a nova string e depois percorres a string velha de i=0 ate ao tamanho dela e sp que encontrares uma cena diferente de 0 copias para o novo array na posicao j e incrementas o j...

claro que consegues fazer isso sem teres de arranjar outra string... depende do que queres...

Posted

Tens uma maneira muita simples de fazer isso... alocas uma nova string , mantens um indice j para a nova string e depois percorres a string velha de i=0 ate ao tamanho dela e sp que encontrares uma cena diferente de 0 copias para o novo array na posicao j e incrementas o j...

claro que consegues fazer isso sem teres de arranjar outra string... depende do que queres...

podes seguir a mesma ideia usando apenas uma string (acho eu...)

basta ter dois inteiros: um indicando o caracter que vais processar de seguida e outro indicando onde o irás escrever;

e nem sequer é necessário determinar o tamanho da string, basta terminar quando encontrar-mos o caracter '\0'.

Posted

Então queres remover todos os espaços de uma string? Se bem percebi do teu exemplo, tendo uma string "___ol__a__" (em que _ representa um espaço), queres que a função devolva "ola"?

Vou dar-te algumas pistas:

  • Só precisas de um while com um if lá dentro;
  • não precisas de saber o tamanho da string.

o algoritmo será algo do género:

  • 1. i e j começam a 0;
  • 2. enquanto o indice i da string nao for o caracter terminador
  • 2.1. se o indice i da string nao for espaço
  • 2.1.1 copia indice i para indice j
  • 2.1.2 incrementa j
  • 2.2 incrementa i
  • 2.3 voltar a 2
  • 3. inserir o caracter terminador na posição j

EDIT: outros responderam enquanto eu estava a elaborar o meu post :😁

Desaparecido.

Posted

antes de mais obrigado a todos que estao a tentar ajudar....

quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas  👍

nao referi uma coisa...esta funçao vai trabalhar a seguir a inserçao de um nome e juntamente com ela tenha mais duas, uma que elimina espaços a esquerda e outra que elimina espaços a direita...ou seja, essa apenas tem que eliminar espaços que se encontrem no meio de palavras e claro deixar um espaço entre elas....entretanto vou pegar nisso e alguma duvida ou problema passo cá... 😁

Posted

o Dev-C++ é um IDE que usa o gcc como compilador

a função strlen faz parte da biblioteca string.h e é ANSI-C por isso é suportada por todos os compiladores que respeitem o ANSI-C

incluindo o gcc claro

BillCats

"quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas  Smiley"

já foram apresentadas soluçoes para o teu problema

😁

Posted

quanto ao uso da strlen: estou a usar o dev-c++ nao sei se ele traz essa funçao, mas como é um trabalho é mais valorizado se apresentar estas funçoes feitas  😁

será?

pelo menos os meus professores não acham muita piada a isso...

eles preferem que utilizemos sempre funções predefinidas, caso elas existam.

até porque não é difícil encontrar a sua definição na net.

Posted

tb axo um bocado estranho, alguem valorizar a construção de uma função quando ela já existe e seria mt mais fácil se fosse usada.

Posted

também acho que nao vai valorizar

já tive um teste a uns anitos que foi so tratamento de strings e nao podiamos usar o string.h

mas isso é um caso a parte

eu nao valorizaria por usares essa função, aliás até dava menos cotação visto que ao ver de um professor pode pensar que nao conheçesses a strlen

Posted

bom pessoal quanto aquilo de valorizar passo a explicar: tivemos uma aula em que aprendemos assim muito rapidamente a manipular strings e inclusive isto de organizar foi entao o que fizemos nesta aula. Eu tinha estas funçoes aqui num ficheiro mas pelo vistos nao estavam la muito bem  :bored: ...como estou a fazer um trabalho e vou precisar delas para organizar o nome (coisa que eu quero colocar pois assim o trabalho tem + valor para o prof.) perguntei ao prof.  o nome das funçoes da biblioteca que me faziam isto inclusive incluir a strlen, a resposta dele foi que como tinhamos feito na aula para eu copiá-las desse ficheiro e colá-las neste que estou a realizar, por isso eu querer utiliza-la assim...

quanto ao problema de organizar espaços multiplos: decidi por fim fazer uma funçao que faz logo tudo, organiza um nome eliminando espaços à esquerda, à direita e no meio deixando 1 espaço entre dois ou mais nomes (este "entre mais" acho que nao tem de ser doutra maneira)...mas ta-me a dar um problemazito qualquer e nao consigo descobrir....

void organizarnome(char *p)
{
     int j=0,i=0,x;
     
     while(p[i]==' '){
                      i++;
                      }
     while(p[i]!=' '){
                      if(p[i]!=' '){
                                    p[j]=p[i];
                                    j++;
                                    }
                                    i++;
                       }
     p[j+1]=' ';
     j++;
     x=mystrlen(p)-1;
     while(p[x]==' '){
                      x--;
                      }
     while(p[x]!=' '){
                      x--;
                      }
     while(p[x]!='\0'){
                       if(p[x]!=' '){
                                  p[j]=p[x];
                                  j++;
                                      }
                                      x++;
                       }
     p[j]='\0';
}

Aqui fica o codigo para teste desta funçao:

#include<stdio.h>
#include<stdlib.h>


int mystrlen(char *s)
{
    int i=0;
    while(s[i]!='\0')
         i++;
    return i;
}

void lefttrim(char *a)
{
     int i=0,j=0;
     
     while(a[i]==' '){
                      i++;
                      }
     while(a[i]!='\0'){
                       a[j]=a[i];
                       i++;
                       j++;
                       }
     a[j]='\0';
}

void righttrim(char *s)
{
     int j,i;
     j=mystrlen(s);
     for(i=j-1;i>=0;i--)
     if(s[i]==' ')
     s[i]='\0';
}

void middletrim(char *p)
{
     int j=0,i=0,x;
     
     while(p[i]==' '){
                      i++;
                      }
     while(p[i]!=' '){
                      if(p[i]!=' '){
                                    p[j]=p[i];
                                    j++;
                                    }
                                    i++;
                       }
     p[j+1]=' ';
     j++;
     x=mystrlen(p)-1;
     while(p[x]==' '){
                      x--;
                      }
     while(p[x]!=' '){
                      x--;
                      }
     while(p[x]!='\0'){
                       if(p[x]!=' '){
                                  p[j]=p[x];
                                  j++;
                                      }
                                      x++;
                       }
     p[j]='\0';
}


int menu()
{
int op;
do {
	printf("\n\nMENU\n");
        printf(" 1 - Inserir string\n");
	printf(" 2 - Tamanho string\n");
	printf(" 3 - Eliminar espaços esquerda\n");
	printf(" 4 - Eliminar espaços direita\n");
	printf(" 5 - Eliminar espaços intermedios\n");
        printf(" 0 - Sair \n");
        printf(" Opcao -->  ");
	scanf("%d",&op);
    	} while(op<0 || op>5);
return op;
}

int main()
{
    int opcao;
    char str[30];
    int x;
do {
        opcao=menu();
        
        switch(opcao){

            case 1: fflush(stdin);
                    printf("Introduza a string: ");
                    gets(str);
                    break;

            case 2: x=mystrlen(str);
                    printf("Numero de caracteres: %d",x);
                    puts(str);
	            break;

            case 3: lefttrim(str);
                    puts(str);
                    break;

            case 4: righttrim(str);
                    puts(str);
                    break;

            case 5: middletrim(str);
                    puts(str);
                    break;
        }
    } while(opcao);
}
Posted

Na função righttrim tens um problema: tens que mudar o for para

for(i=j-1;i>=0;i--)
	if(s[i]!=' ') break;

s[i]='\0';

, para saires do ciclo for assim que encontras um caracter não espaço, senão se tiveres uma string "uma string    ", a função percorre toda a string até ao início e coloca um '\0' também a seguir à palavra "uma", e acabas por ficar com a string "uma". Pior ainda, se tiveres a string "  uma string", com espaços no início, ficas com uma string vazia, porque a função coloca um '\0' na 1ª posição da string.

Nota que a linha s[ i ]='\0'; está fora do for.

Depois, temos a middletrim. Consegui fazê-la com com 2 indices, um while com dois ifs dentro, e outro fora.

Parte do teu raciocínio está correcta. Vamos utilizar 2 índices, um a dizer onde queres escrever (j), e outro a dizer de onde queres ler (i).

A partir daí é utilizares um while para percorrer a string de ponta a ponta; se o caracter que lês é um espaço, apenas incrementas i; senão, tens que fazer duas coisas:

  • copiar a posição i para a posição j, e incrementar i e j;
  • ver se o caracter na posição a seguir a i é espaço, e caso seja colocas um espaço na posição j, e incrementas i e j novamente;

Quando termina o while, vês se a posição j-1 é um espaço; se for decrementas j;

Finalmente, colocas o '\0' na posição j.

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.