Jump to content

Eliminar espaços multiplos de 1 string


BillCats
 Share

Recommended Posts

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  ?

Link to comment
Share on other sites

theproject

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...

Link to comment
Share on other sites

Rui Carlos

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'.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

mystrlen é uma funçao implementada por mim que me devolve o numero de caracteres da string (o seu tamanho)...

porque não usar a strlen?!

Link to comment
Share on other sites

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á... 😁

Link to comment
Share on other sites

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

😁

Link to comment
Share on other sites

Rui Carlos

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.

Link to comment
Share on other sites

Guest id194

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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);
}
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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
 Share

×
×
  • 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.