Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

BrunoT

Eliminar espaços de uma string

Mensagens Recomendadas

BrunoT

Boas !

Tenho um trabalho da faculdade em que está praticamente terminado, só falta mesmo uma função que elimine os espaços da string. O programa é mais ou menos complexo, por isso deixei estas ultimas afinações para o final, mas não está fácil. O mais incrivel é que eu acho que estou a fazer direito, por isso o meu bloqueio.

Fica aqui a parte que interessa no código para me tentarem ajudar, se for possível.

 printf("Insira o texto a cifrar:\n");
                scanf("%s",frase);
                for (i=0;i<strlen(frase);i++) {
	  if (!isspace(frase[i])) {
	    nfrase[cont] = toupper(frase[i]);
	    cont++;
	  }
	}
	nfrase[strlen(nfrase)] = '\0';
	printf("Insira a palavra-chave:\n");
                scanf("%s",chave);
                for (i=0;i<strlen(chave);i++) chave[i] = toupper (chave[i]);
	printf("\npalavra sem espacos: %s\n",nfrase);
                for (k=0;k<strlen(frase);k++) {

Ah ! Não sei se é importante ou não, mas estou a programar em unix.

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Cont está inicializado? Costuma ser um erro habitual quando não se usa for, pelo menos para mim.

Deixo aqui uma solução em que não precisas de usar outra string:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "Localhost yeah yeah";
    int aux;
    for(aux = 0; aux < strlen(str); aux++) {
        if(str[aux] == ' ') {
            str[aux] = str[aux + 1];
        }
    }
    printf("%s\n", str);
    return 0;
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
merlin3000

A ideia parece estar correcta. Sem saber o resto do código o que pode estar mal é, como disse o localhost, o cont não estar inicializado. Também pode ser nfrase se não tiver sido inicializado com o tamanho correcto.

Uma coisa no teu código é o '\0' não tem que ser posicionado desta forma

nfrase[strlen(nfrase)] = '\0';

este seria o caso em que não existem espaços na frase. algo como

nfrase[cont] = '\0';

deverá servir.

Uma pequena alteração ao código do localhost para eliminar os espaços em vez dos substituir.

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "Localhost yeah yeah";
    int posW = 0, posR = 0;

    for(posR = 0; posR < strlen(str); posR++) {
        if(str[posR] == ' ') 
	continue;
str[posW] = str[posR];
posW++;
    }
    str[posW] = '\0';

    printf("%s\n", str);
    return 0;
}


Criar é Divertido

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Antes de mais obrigado pelas vossas ajudas  :D

Este último é praticamente igual ao meu ... alterei para esta forma e dá o mesmo resultado que o meu .. isto é :

Se eu inserir "teste teste", dá como resultado "TESTE" ... ou seja, corta no primeiro espaço ... e o segundo printf a pedir para inserir a chave aparece, mas não espera para que eu escreva, continua o programa ...

Cumprimentos

EDIT: Localhost, não testei o que vou dizer, mas penso que a tua função não dá o resultado esperado. Exemplo:

"gosto de"

a tua função penso que dará "gostodde" ... certo ? :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Sim, tens razão, nem reparei. Se sem experimentares o código conseguiste ver o que ia acontecer também não te deve ser muito dificil resolver esse problema. :D

Mas acho que consegui passar a ideia de como fazê-lo, sem usar uma string auxiliar que só ocupa espaço e é desnecessária.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Obrigado pela ideia Localhost :D

De facto, já tentei pelo menos de 10 formas diferentes ( sem exagerar ) e dá-me sempre o mesmo resultado :s

O que me deixa revoltado é que o programa é complexo, e estou "encravado" numa coisa tão simples  :wallbash:

Cumprimentos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Pronto, eu juro que deixo de ser guloso :D

Deixo-te aqui uma solução a funcionar com uma string auxiliar:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "Localhost yeah yeah";
    char novo[120];
    int aux;
    int i = 0;
    for(aux = 0; aux < strlen(str); aux++) {
        if(str[aux] != ' ') {
            novo[i] = str[aux];
            i++;
        }
    }
    novo[i] = '\0';
    printf("%s\n", novo);
    return 0;
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
merlin3000

não funciona? estranho. Testei o teu código no primeiro post e também a alteração que fiz ao do localhost e ambos funcionam. O resultado é "localhostyeahyeah". Vê se não tens mesmo algum problema com inicializações ou assim.

Edit: ó agora é que reparei, experimenta imprimir a string logo a seguir a recebê-la, esse scanf só deve ler até ao primeiro espaço. Se for esse o caso usa fgets em vez do scanf.


Criar é Divertido

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Lol, claro. O scanf só lê até ao primeiro espaço ou até ser encontrado um \n. Usa o fgets como o merlin3000 disse.

No entanto, acho que o meu último código funciona.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Não tenho aqui o meu .c para puder testar esse código, mas hoje ainda vejo isso e dou feedback.

Tenho que "bater" o código linha a linha ... Noitada prevista.

Obrigadão pelas dicas pessoal, espero um dia puder-vos retribuir com alguma ajuda.

EDIT: Só agora vi o edit do merlin3000 ! isso tem muita lógica ... cheira-me que o problema ta aí.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Sim, o problema está aí. Se reparares o meu código é igual ao teu, praticamente, a ideia é a mesma. No meu str está inicializado.

p.s. Não uses scanf, só traz problemas, a nível de segurança e dos que estás a ter agora :D


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Afinal consegui aceder ao meu .c

O problema é que agora aparece os 2 printf's seguidos ... vou copiar o código ...

 printf("Insira o texto a cifrar:\n");
                fgets(frase,100,stdin);
                for (i=0;i<strlen(frase);i++) {
	  if (frase[i] != ' ') {
	    nfrase[cont] = toupper(frase[i]);
	    cont++;
	  }
	}
	nfrase[cont] = '\0';
	printf("Insira a palavra-chave:\n");
                fgets(chave,100,stdin);
                for (i=0;i<strlen(chave);i++) chave[i] = toupper (chave[i]);
	printf("\npalavra sem espacos: %s\n",nfrase);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Pus logo a seguir ao primeiro fgets, ele espera que eu insira a string ... mas depois aparece o segundo printf e continua o programa :s

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não é recomendável mas experimenta com a função fflush. Assim:

fflush(stdin);

E já agora mete aqui o código.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Não sei se estará correcto ... tenho o mesmo problema

 case 1: {
                printf("Insira o texto a cifrar:\n");
                fgets(frase,100,stdin);
	fflush(stdin);
                for (i=0;i<strlen(frase);i++) {
	  if (frase[i] != ' ') {
	    nfrase[cont] = toupper(frase[i]);
	    cont++;
	  }
	}
	nfrase[cont] = '\0';
	printf("Insira a palavra-chave:\n");
                fgets(chave,100,stdin);
	fflush(stdin);
                for (i=0;i<strlen(chave);i++) chave[i] = toupper (chave[i]);
	printf("\npalavra sem espacos: %s\n",nfrase);
                for (k=0;k<strlen(frase);k++) {    
                    for (i=0;i<26;i++) {
                        if (frase[k] == alfabeto[i]) flagcima = i;    
                    }

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Não, assim aparece-me os dois printf's seguidos ... Não estou mesmo a perceber.

Qual a forma mais fiável para ler as strings em C ? é o fgets ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Mas deixa-te inserir dados no primeiro fgets ou não?

Sim, fgets é o melhor. Tem um contra. Inclui o \n. Tens de ter cuidado com isto, especialmente em comparações.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Aparecem os dois printf's ... e depois fica a espera que eu insira uma string.

Então com o fgets convém por um '\0' na ultima posição da string certo ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Lol, então tens de utilizar o fflush ou o outro exemplo que te dei (usa o exemplo porque é melhor, em termos de portabilidade) depois do fgets que está antes do primeiro do código que deste aqui.

Acho que é melhor mostrares aqui o código dessa função.

Sim, convém. Assim:

str[strlen(str) - 1] = '\0';


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
BrunoT

Continua sem funcionar :s vou por aqui mais partes do código ... não vou por as outras funçoes a seguir porque já não interfere com esta, por isso penso que não há problema.

#include <stdio.h>
#include <string.h>
int main ()
{
  int op,i,k,flagcima,flagvertical,flag=0,cont=0;
  char frase[100],chave[100],cifra[100],alfabeto[26],nfrase[100];
    alfabeto[0] = 'A';
    for (i=1;i<26;i++) {
        alfabeto[i] = alfabeto[i-1] + 1 ;   
    }
    while (flag!=1)  {
      printf("\n\nEscolha uma das seguintes opcoes:\n\t 1 - Cifrar Mensagem \n\t 2 - Decifrar Mensagem \n\t 3 - Sair\nOpcao: ");
    scanf("%d",&op);
        switch (op) {
           case 1: {
                printf("Insira o texto a cifrar:\n");
                fgets(frase,100,stdin);
                for (i=0;i<strlen(frase);i++) {
	  if (frase[i] != ' ') {
	    nfrase[cont] = toupper(frase[i]);
	    cont++;
	  }
	}
	nfrase[cont] = '\0';
	scanf("%*[^\n]");
	printf("Insira a palavra-chave:\n");
                fgets(chave,100,stdin);
                for (i=0;i<strlen(chave);i++) chave[i] = toupper (chave[i]);
	printf("\npalavra sem espacos: %s\n",nfrase);
                for (k=0;k<strlen(frase);k++) {    
                    for (i=0;i<26;i++) {
                        if (frase[k] == alfabeto[i]) flagcima = i;    
                    }
                    for (i=0;i<26;i++) {
                        if (chave[k%strlen(chave)] == alfabeto[i]) flagvertical = i;
                    }
                cifra[k] = ((flagcima + flagvertical) % 26) + 65;
                }    
                cifra[strlen(frase)] = '\0';
                printf("\nTexto Cifrado: %s\n",cifra); 
	break;
            }

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.