Ir ao conteúdo
  • Cadastre-se

C Como posso colocar caracteres no meio de uma string, sem sobrescreve-la em c?


Diovani Facco

Posts recomendados

Como posso colocar caracteres no meio de uma string, sem sobrescreve-la?

Preciso cada vez que encontrar um espaço, adicionar mais 3 espaços:

 

TESTE TESTE TESTE

 

E transformar pra isso:

 

TESTE     TESTE      TESTE

 

Tentei fazer assim, ele até adiciona os espaços, mas esta sobrescrevendo o resto da string...

 

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

int main(){
int i,j;
char s[100], teste[100];

printf("Digite sua frase: ");
gets(s);

for(i=0; s[i] != '\0'; i++){
    if(s[i] == ' '){
        for(j=0; j < 4; j++){
            teste[i++] = ' ';
        }
    }
}
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Olá @Diovani Facco 

Considere haver capacidade no vetor, logo terá que sobrescrever os elementos de qualquer maneira ao copiar elementos a frente quando encontrar espaço em branco.

TESTE TESTE TESTE
     ^                                                           TESTE   TESTE TESTE
     |                                                                   ^
     +---------> a partir desse ponto                                    |
T, E são copiadas [para memoria temporaria] e atribui-se ' '' ' <+ ------+ 
S, T     //                //                //           T, E   |
...                                                              |
Até alcançar '\0' e depois o laço mais externo continua          |
do ponto, após a 1st atribuição ---------------------------------+

Esse plano faz sentido?

:) 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Diovani Facco De que te serve `teste`?

1 hora atrás, Diovani Facco disse:

ele até adiciona os espaços, mas esta sobrescrevendo o resto da string

Sim, no seu código caso seja encontrado o caractere espaço, são armazenados 3 espaços nas posições seguintes, sobrescrevendo o que tiver por lá.

O que você pode fazer é mover os caracteres das posições seguintes antes para que não sobrescreva nada, começando do '\0' e decrementando o contador até que atinja o valor do índice `i`:

if(s[i] == ' ')
{
    for(k = strlen(s); k > i; k--)
    {
        // Movendo 3 posições para a direita
        s[k + 3] = s[k];
    }
    for(j = 0; j < 4; j++)
    {
        s[i++] = ' ';
    }
}

TESTE TESTE\0

Primeiro loop:

TESTE TESTE\0  \0

TESTE TESTE\0 E\0

TESTE TESTE\0TE\0

TESTE TESTESTE\0

TESTE TESTESTE\0

TESTE TESTESTE\0

Segundo loop:

TESTE TESTESTE\0

TESTE  ESTESTE\0

TESTE   STESTE\0

TESTE    TESTE\0

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 14/01/2022 às 22:09, Diovani Facco disse:

Como posso colocar caracteres no meio de uma string, sem sobrescreve-la?

Preciso cada vez que encontrar um espaço, adicionar mais 3 espaços:

 

TESTE TESTE TESTE

 

 

Pois é: não pode. A menos que ela não tenha espaços você vai sobrescrever algo. Mesmo que o espaço esteja no fim e seja um só você vai sobrescrever o 0 no fim e acrescentar mais 3 espaços, como disse... 

 

Se isso vai ser feito por uma função e quer algo seguro o mais simples pode ser contar os espaços e alocar uma nova com o tamanho da original + 3X o número de espaços que achou. E retornar o endereço da nova string. 

 

Ou, a la fgets(), receber um parâmetro com o tamanho da string e aí ver se cabe e retornar um int com zero se deu tudo certo ou um código de erro.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...