• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

BillCats

[AJUDA]Eliminar espaços multiplos de 1 string

13 mensagens neste tópico

Boas a todos  :thumbsup:

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  :cheesygrin: Obrigado  :ipool:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 ::cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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  :thumbsup:

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á... :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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  :cheesygrin:

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora