Remover Espaços a direita de um texto? [RESOLVIDO]

1. Remover Espaços a direita de um texto? [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 04/08/2020 - 18:21h

Eu tenho 1 arquivo que em algumas linhas possuem espaços em branco a direita do texto, ou seja, espaços desnecessários!
Então eu gostaria de removê-los em C.

Não sei se existe algo pronto pra fazer isso em C, se existir, eu gostaria de saber para estudar!
Porém, eu também gostaria de saber como posso fazer isso! Tipo as idéias que existem sobre isso!

A única idéia que eu tive pra fazer isso foi a de ler as linhas de trás pra frente, apagando os espaços em branco até encontrar algum caracter! Isso porque não faço a mínima idéia de como eu poderia ler do início ao fim, visto que todo texto possue espaços entre palavras, então de trás pra frente parece ser fácil!

Não sei se a idéia que tenho é absurda, mas foi a única que tive! Então se existe outras formas ou idéia melhor de se fazer isso, eu gostaria de saber!



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/08/2020 - 22:53h

Como você sabe, em C, o fim da string é indicado por um byte nulo.

Então, para remover espaços após um determinado texto (entendo que, quando você diz “à direta”, está falando de uma língua em que se escreve da esquerda para a direita, tal como línguas europeias, inclusive o Português), basta colocar um byte nulo no lugar do primeiro espaço que você quiser descartar.

Uma possibilidade de fazer é a seguinte.
// “str” é a string de que se quer desconsiderar espaços ao final.
char *p=str+strlen(str);
while(--p>=str && isspace((unsigned char)*p))
;
*++p=0; // Põe um byte nulo nesta posição.


Eu torço um pouco o nariz para essa solução porque ela varre a string duas vezes: uma para ver o tamanho (dentro de strlen(), que é, justamente por isso, uma operação relativamente cara), e a segunda, de trás para frente, para encontrar o local do último não espaço, a fim de colocar o marcador de fim da string na posição imediatamente seguinte.

Outra abordagem, com uma varredura só, é já marcar a posição seguinte ao último não-espaço enquanto se tenta encontrar o fim da string.
char *p=str, *q=NULL;
do {
while(*p && !ispace((unsigned char)*p))
++p;
if(!*p)
break;
q=p;
while(isspace((unsigned char)*++p)) // Não preciso testar explicitamente se *p (ou *++p) é nulo porque se for espaço seguramente não é nulo.
;
} while(*p);
if(q)
*q=0;


Mas eu não sei se é seguro afirmar qual das duas é melhor. No primeiro caso, o laço de repetição interno de strlen() só tem uma condição a ser testada, e é possível trabalhar com apenas um ponteiro (ou um índice) sobre a string original. Se tal string for muito grande e tiver uns poucos espaços em branco no final, a eficiência no loop de ida pode compensar o custo maior (por causa das duas comparações que tem de fazer) do loop de volta, que, nesse caso, acaba tendo relativamente poucas iterações. O tempo de execução, portanto, é variável, e tanto maior quanto mais espaços houver ao final da string de entrada. O pior caso, portanto, é uma string formada apenas por espaços, pois ela obriga a varrer a string inteira duas vezes.

O segundo exemplo tem apenas um laço de repetição, ao custo de ter dois ponteiros (ou índices) e de fazer dois testes a cada iteração. O número de iterações é sempre proporcional ao tamanho da string de entrada, sem depender da quantidade de espaços no final, mas a quantidade de desvios e de atribuições muda, dependendo do conteúdo da string.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts