M@KO Posted February 19, 2012 at 07:56 PM Report Share #440360 Posted February 19, 2012 at 07:56 PM Boas! Existe algum comando para eliminar os espaços em branco no inicio da string? Por exemplo: str=" frase depois de espaços"; comando(str); obrigado edit: GeSHi adicionado (pmg) cool stuff http://blog.zxcoders.com/ Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted February 19, 2012 at 07:59 PM Report Share #440361 Posted February 19, 2012 at 07:59 PM esse tipo de funções tem o nome de trim .. em c terás de criar tu a tua ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
pmg Posted February 19, 2012 at 08:21 PM Report Share #440363 Posted February 19, 2012 at 08:21 PM Atencao que str aponta para uma string nao modificavel. str = " frase depois de espacos"; char *ptr = str; while (*ptr) { // if (*ptr == ' ') *ptr = '_'; // ilegal ptr++; } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
M@KO Posted February 20, 2012 at 12:56 AM Author Report Share #440386 Posted February 20, 2012 at 12:56 AM Obrigado, já consegui fazer a função trim. Fiz assim: #include<stdio.h> char *trim(char *ptr) { while(*ptr!='\0') { if(*ptr!=' ') return ptr; ptr++; } return; } int main() { char str[10]; gets(str); strcpy(str,trim(str)); printf("%s",str); } 😞 cool stuff http://blog.zxcoders.com/ Link to comment Share on other sites More sharing options...
pmg Posted February 20, 2012 at 09:53 AM Report Share #440394 Posted February 20, 2012 at 09:53 AM Tá mal ... De acordo com a especificação da função strcpy() não podes copiar "dentro" da mesma string. If copying takes place between objects that overlap, the behavior is undefined. O que o teu programa faz é arranjar um apontador para o primeiro não espaço "dentro" da string e depois copiar a partir desse apontador para o início da mesma string. Não faças isso. Sugestão, usando o máximo do teu código (também substituí o gets() por fgets()) #include <stdio.h> char *trim(char *ptr) { while (*ptr != '\0') { if (*ptr != ' ') return ptr; ptr++; } return NULL; } int main(void) { char str[10]; fgets(str, sizeof str, stdin); // strcpy(str, trim(str)); printf("%s", trim(str)); return 0; } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
RiKoNnEcT Posted February 20, 2012 at 03:56 PM Report Share #440443 Posted February 20, 2012 at 03:56 PM Acho que também podes fazer assim, para se por acaso não quiseres só imprimir mas sim guardar essa nova "string" para futuras operações #include <stdio.h> #define MAX 100 void trim (char *s,char *s2) { int i=0,x; while(s[i]==' ') { i++; } for(x=0;s[x-1]!='\0';x++) { s2[x]=s[i]; i++; } } void main (void) { char str[MAX]; char str2[MAX]; fgets(str,sizeof str,stdin); trim(str,str2); printf("%s",str2); } Link to comment Share on other sites More sharing options...
pmg Posted February 20, 2012 at 04:06 PM Report Share #440448 Posted February 20, 2012 at 04:06 PM for(x=0;s[x-1]!='\0';x++) Ai, ai!!! Imagina que a string original não tem espaço nenhum: vais aceder ao "elemento" x[-1] que não existe. Para mim, a maneira mais prática é com ponteiros char *trimleft(const char *src, char *dst) { char *bk = dst; while (*src == ' ') src++; while (*dst++ = *src++) /* void */; return bk; } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
RiKoNnEcT Posted February 20, 2012 at 08:41 PM Report Share #440484 Posted February 20, 2012 at 08:41 PM Não me lembrei desse "pormenor", my bad :S Link to comment Share on other sites More sharing options...
M@KO Posted February 20, 2012 at 10:19 PM Author Report Share #440499 Posted February 20, 2012 at 10:19 PM Estou aqui a analisar o código da função trimleft() do PMG e vamos ver se percebi B) - recebe a string origem e a string destino - depois é criado um ponteiro *bk só pa ficar a apontar para o inicio da string destino - e enquanto houver espaços a string o ponteiro origem avança - depois vem aquele ciclo while que incrementa ambos os ponteiros e iguala-os, tudo ao mesmo tempo e para no fim da string origem. - por fim retorna o inicio da string destino. é isto? o segundo ciclo while é algo que nunca tinha visto B) vou testar a coisa e ver como usar isto da melhor maneira. O que eu estou a fazer é copiar texto de um ficheiro para outro apagando todos os espaços no inicio das linhas, por isso teres substituído o gets() por fgets() veio a calhar. Muito obrigado pela ajuda que me estão a dar. 😛 cool stuff http://blog.zxcoders.com/ Link to comment Share on other sites More sharing options...
pmg Posted February 20, 2012 at 10:36 PM Report Share #440502 Posted February 20, 2012 at 10:36 PM - depois vem aquele ciclo while que incrementa ambos os ponteiros e iguala-os, tudo ao mesmo tempo LOL! Aquele while pode ser decomposto assim: // while (*dst++ = *src++) /* void */; do { char copied = *src; *dst = copied; // copia um caracter, que pode ser o '\0' src++; // aponta src para o caracter seguinte dst++; // aponta dst para a posicao seguinte } while (copied != '\0'); //enquanto o caracter copiado nao for o '\n' // Nota que aqui, tanto o src como o dst podem estar a apontar /// para algum sitio invalido E a tua analise foi mais ou menos correcta: a atribuicao nao é feita a ponteiros, é feita ao que eles apontam. O que eu estou a fazer é copiar texto de um ficheiro para outro apagando todos os espaços no inicio das linhas, por isso teres substituído o gets() por fgets() veio a calhar. Vais no bom caminho. Qualquer coisa estamos aqui 😛 What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now