Jump to content
ColumboJedi

[Ajuda] remover letra na posisao x de String

Recommended Posts

ColumboJedi

Ola a todos.

tenho uma duvida.

por exemplo eu tenho "Benfica"...e tenho x=4;

e quero remover a letra na posição x,

que supostamente devia ficar "Benica"...

alguem me ajuda ? estou confuso.

Paz... \m/

Share this post


Link to post
Share on other sites
Baderous

Tens de mover todas as letras a partir dessa para a posição anterior, de modo a sobrepor a letra que queres apagar. Ou seja, queres apagar a letra na posição i, então tens de mover todas as letras na posição j, com j>i, para a posição j-1.

Share this post


Link to post
Share on other sites
KTachyon

char c[] = "Benfica";
char final[10];
int x = 3, i;

for (i = 0; i < sizeof(c); i++) {
    if (i < x) final[i] = c[i];
    else if (i > x) final[i-1] = c[i];
}

final[i] = 0;

printf("%s", final);

Atenção que o primeiro char, sendo o zero, que queres o 4º char, tens que subtraír 1 (logo será o 3).


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Baderous

Não é preciso usar 2 strings:

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

int main(void) {
        char str[] = "Benfica";
        int i, len=strlen(str), x;
        scanf("%d",&x);
        for (i=x-1;i<len;i++)
                str[i] = str[i+1];
        printf("%s\n",str);
        return 0;
}

Share this post


Link to post
Share on other sites
KTachyon

Ya, tens razão. Mas é preciso colocar o \0 na última posição.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

Ya, tens razão. Mas é preciso colocar o \0 na última posição.

Nope. O \0 já está lá. No máximo era necessário recuá-lo uma posição.

Uma coisa que não gosto de ver (e que já perdi o vício) é utilizar a função strlen para percorrer uma string. Isto bastava:

for (i = x - 1; str[i]; i++)

Pondo o código de uma maneira ligeiramente diferente:

#include <stdio.h>

int main (void)
{
    char str[1024];
    int i = 0, x = 0;

    fgets (str, 1024, stdin);
    scanf ("%d", &x);

    for (i = x - 1; str[i]; i++)
       str[i] = str[i + 1];
   		
    printf ("%s", str);

    return 0;
}

Penso que com aquela condição no ciclo o \0 já era arrastado.


here since 2009

Share this post


Link to post
Share on other sites
ColumboJedi

lol. Eu ia responder...e no momento de submeter... recebi um aviso que mais alguem ja respondeu.

Muito obrigado. pessoal. ja funçiona,

eu ia submeter este codigo... mas pronto.

tnks.

int remove (char t, int x)

{

    int i;

    int j;

    int size = strlen(t);

    for ( j=x; j < (size-1); j++)

          {

              t [j] = t[j+1];  // copia a letra a seguir para uma posiçao anterior...

          }

      return size-1; // o tamanho fika com menor,,pk removi uma letra.. pk se size se manter vou ter benicaa ...dois "a"...

}

Share this post


Link to post
Share on other sites
KTachyon

Nope. O \0 já está lá. No máximo era necessário recuá-lo uma posição.

Pah, ya. O objectivo da minha afirmação era escrever o output correcto. Por última posição, diga-se, última posição da "nova" string.

Repara que para o primeiro char, a tua solução não funciona.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

Yah, tens razão. Não reparei nesse pormenor.. modificado.  ;)


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Uma coisa que não gosto de ver (e que já perdi o vício) é utilizar a função strlen para percorrer uma string. Isto bastava:

for (i = x - 1; str[i]; i++)

Isso é meramente uma questão de gosto, não há diferença.

Share this post


Link to post
Share on other sites
KTachyon

Não é que seja mto diferente, visto que vão ficar dois \0 seguidos em memória ;)

Mas se um utilizador colocar um x maior que a string, o ciclo for pode só parar quando sair da área de memória reservada do programa... e consecutivamente com um crash.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Localhost

@Baderous

Isso é meramente uma questão de gosto, não há diferença.

Depende. Há pessoal que utiliza algo como isto:

for (i = 0; i < strlen (str); i++)

Obviamente que isto é mau código visto que a cada iteração vamos estar a chamar a função strlen.

A maneira que tu usaste é menos eficiente do que simplesmente verificares se encontraste um \0, além de não fazer diferença nenhuma...

Just say NO to strlen.

@KTachyon

Não percebi para quem foi essa resposta mas suponho que tenha a ver com o facto de se utilizar o strlen ou a verificação do \0 no ciclo.

Claro que existe esse problema, mas era facilmente corrigido com uma verificação do valor dado ao x.

*UPDATE*

Já agora, como diz numa resposta no link que deixei, a maneira mais rápida de percorrer a string era:

char *ptr = NULL;

for (ptr = str; *ptr != '\0'; ptr++)

Visto que com o str[ i ] != '\0' o compilador tinha que fazer o cálculo str + i.


here since 2009

Share this post


Link to post
Share on other sites
ColumboJedi

ok, outra duvida.

e se tenho assim,

char s[] = "portas";

                                            (a funçao para remover o caracter da ultima posiçao..que devera ficar "porta"... )

printf(" %s \n", remover(s) );

OUTPUT

porta

como faço para printf  funcionar ?

tipo. a funçao devia ter

      char remover (char str)....

      return qualquer coisa....

e depois return fika como ? temos usar apontadores ?

Share this post


Link to post
Share on other sites
Localhost

A função só remove o último caracter? Se for isso não precisas de retornar nada.


here since 2009

Share this post


Link to post
Share on other sites
ColumboJedi

bem, vou directamente ao assunto.

meu objectivo é fazer o seguinte.

tenho "abab"  e "abacb"

e depois fazer um ciclo para comparar o seguinte

abab  com abacb

abab  com bacb

abab  com aacb

abab  com abcb

abab  com abab  BAHH..encontrou....

tipo ir removendo letras ate encontrar a string igual.

portanto ia usar a funçoa que foi submetida neste post... mas mudava um pouco.

mas de preferencia preciso que ela retorna a string nova sem letra da posiçao que eu indicar.... xD

Share this post


Link to post
Share on other sites
Localhost

Sendo assim, as coisas já mudam um bocado.

Fazias um ciclo que ia de 0 até N - 1 (N é o tamanho da string), vamos chamar utilizar para o efeito uma variável chamada i. Para cada i chamavas a função que te ia retornar a string modificada e comparavas as duas strings (a que foi retornada pela função e a recebida inicialmente).

O problema desta abordagem é que terias que retornar uma string, e para isso terias que utilizar memória dinâmica (não tenho muito tempo para explicar porquê). O melhor mesmo era passares para a função a string recebida inicialmente, declarar dentro dela uma string que vai ter no final a string modificada e utilizar o código que o KTachyon apresentou no início do tópico.

Algo como isto:

void compare_strings (char *my_string, int i)
{
    char new_string[MAX_LEN];
    int k = 0;

    for (k = 0; my_string[k]; k++)
    {
        if (k < i)
           new_string[k] = my_string[k];
        else if (k > i)
           new_string[k - 1] = my_string[k];
    }
       
    new_string[k] = '\0';    

    // comparar strings aqui
}


here since 2009

Share this post


Link to post
Share on other sites
ColumboJedi

usar o malloc ?

eu vou fazer o que conseguir..depois digo qualquer coisa

  tnks pela ajuda.

Share this post


Link to post
Share on other sites
Localhost

Sim, tinhas que utilizar memória dinâmica se quisesses mesmo retornar a string.


here since 2009

Share this post


Link to post
Share on other sites
Baderous

A maneira que tu usaste é menos eficiente do que simplesmente verificares se encontraste um \0, além de não fazer diferença nenhuma...

Just say NO to strlen.

Não consegues dizer se é mais ou menos eficiente sem conhecer a implementação interna da strlen, as optimizações feitas pelo compilador e a arquitectura da memória e do CPU. Há muitas variáveis envolvidas.

Share this post


Link to post
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

×
×
  • 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.