Jump to content

Editar strings


M@KO
 Share

Recommended Posts

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

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);
}

😞

Link to comment
Share on other sites

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

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

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

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.

😛

Link to comment
Share on other sites

- 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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.