domingo, 7 de octubre de 2012

Limpar espazos o principio e final dunha cadea [Twitcode X][C]

Hoxe imos copiar unha cadea sen os espazos o comezo e o final:

char *strip(char *s){for(;s[0]==' ';s=&s[1]);s=strdup(s);int l=strlen(s)-1;while(s[l]==' ')s[l--]='\0';return s;}

Actualización: @varogb7 aporta unha versión máis eficiente, que só recorre unha vez a cadea (a diferencia das dúas que o fai o anterior), tedes o código aquí a continuación. Moitas grazas polo apoio! ;)

void strip(char *target, const char *source){
    int i=0, desfase = 0;
    *target='\0';
    for(i=0; source[i] == ' ' ; i++) desfase++;
    int ultimoCaracterDistintoDeEspacio = 0; 
    for( ; source[i]!='\0' ; i++ ){
         target[i-desfase] = source[i];
         if(source[i]!=' ') ultimoCaracterDistintoDeEspacio = i;
    }
    if( i-desfase == 0 ) target[ultimoCaracterDistintoDeEspacio-desfase]='\0'; 
    else         target[ultimoCaracterDistintoDeEspacio-desfase+1]='\0';
}

Un exemplo de uso:
#include <stdlib.h>

void strip(char *target, const char *source){
    int i=0, desfase = 0;
    *target='\0';
    for(i=0; source[i] == ' ' ; i++) desfase++;
    int ultimoCaracterDistintoDeEspacio = 0; 
    for( ; source[i]!='\0' ; i++ ){
         target[i-desfase] = source[i];
         if(source[i]!=' ') ultimoCaracterDistintoDeEspacio = i;
    }
    if( i-desfase == 0 ) target[ultimoCaracterDistintoDeEspacio-desfase]='\0'; 
    else         target[ultimoCaracterDistintoDeEspacio-desfase+1]='\0';
}


void main(){
     char *str = "   Esta é unha proba   ";
     char stripped[30];
     strip( stripped , str);
     printf("'%s' -> '%s'\n", str, stripped);
     getchar();
}

Voltando o twitcode, imos por partes, así quedaría adecuadamente separada:
char *strip(char *s){
    // Busca o primeiro caracter da cadea diferente de ' '
    for(;s[0] == ' '; s = &s[1]);

    // Fai unha copia da cadea
    s = strdup(s);

    // Determina o último caracter para comprobar
    int l = strlen(s) - 1;

    // Mentres que o último sexa un espazo
    while(s[l] == ' ')
        // Eliminalo
        s[l--]='\0';

    return s;
}

Por exemplo:
#include <string.h>
#include <stdlib.h>

char *strip(char *s){for(;s[0]==' ';s=&s[1]);s=strdup(s);int l=strlen(s)-1;while(s[l]==' ')s[l--]='\0';return s;}

char *string = "   Esta é unha proba   ";

int main(){
     char *stripped = strip(string);
     printf("'%s' -> '%s'\n", string, stripped);
     // Pra mante-la memoria limpa :P
     free(stripped);
     return 0;
}

Saída:
'   Esta é unha proba   ' -> 'Esta é unha proba'

Espero que vos gustara, e algo que nalguns casos pode resultar útil, inda que non comprimido :)

No hay comentarios:

Publicar un comentario