Ir ao conteúdo

Posts recomendados

Postado

Preciso fazer um código que a primeira entrada seja o número de nomes que vou digitar e depois que eu digite os nomes ele abrevie esses nomes como nos exemplos abaixo:
Albert Einstein -> Einstein, A.
Napoleão Bonaparte -> Bonaparte, N.
Franklin Delano Roosevelt -> Roosevelt, F.D.
O problema é que na hora de printar o nome abreviado o ele ta imprimindo um espaço em branco.
segue o código abaixo:

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

//Essa funcao remove as palavras indesejadas
void removerSubstring(char *s,const char *remover)
{
    while((s = strstr(s,remover)) != NULL)
        memmove(s, s + strlen(remover), 1 + strlen(s+strlen(remover)));
}

void abrevia(char *nome)
{ 
  char aux [51];
  int i,auxiliarult,j,ult,esp=0;
  for (i=0;i<strlen(nome);i++) if (nome[i]==' ') esp++; //conta o nº de nomes
  for (i=0;i<strlen(nome);i++)
    {
      j=0;
      if (nome[i]==' ') j++;
      ult=i+1; //posição do começo do último nome
    }  
    for (i=0;i< strlen(nome)-(ult-1);i++) // passa o ultimo nome para um auxiliar
    {
      auxiliarult=ult;
      aux[i]=nome[auxiliarult];
      auxiliarult++;
    }
    
    int proxlivre=strlen(nome)-ult+2; //prox. posição livre no aux
    aux[proxlivre]=','; // adiociona a virgula dps do nome
    proxlivre++;
    aux[proxlivre]=' '; // adiociona o espaço
    proxlivre++;
    aux[proxlivre]=nome[0]; // adiociona 1ª inicial
    proxlivre++;
    aux[proxlivre]='.'; 
    proxlivre++;
    aux[proxlivre]=' ';
    proxlivre++;
    for (i=0;i<ult;i++)
    {
      if (nome[i]==' ') 
        {
          aux[proxlivre]=nome[i+1];
          proxlivre++;
          aux[proxlivre]='.';
          proxlivre++;
        }

    } 
    printf ("%s",aux);
    strcpy(nome,aux);
}


int main( void ){
	int n,i;
  char nome [51];
  scanf ("%d",&n);
  getchar();
  for (i=1;i<=n;i++){
  gets (nome);
  removerSubstring(nome, "da "); //usamos a função para remover
  removerSubstring(nome, "das ");// todas as palavras que devem
  removerSubstring(nome, "de "); // ser ignoradas
  removerSubstring(nome, "des ");
  removerSubstring(nome, "do ");
  removerSubstring(nome, "dos ");
	abrevia(nome);
	puts(nome);
  }
	return 0;
}
 

 

  • Obrigado 1
Postado

@gabrielzin44     seu código está bom ,  mas ele não está imprimindo nada , então seu código com algumas modificações poderia ser assim  :

#include <stdio.h>                           /* para usar as funções de entrada e saída                   */
#include <conio.h>                           /* para usar a função getch()                                */
#include <string.h>                          /* para trabalhar com string                                 */
#include <ctype.h>                           /* para usar a função toupper                                */
char nome[51];                               /* var global p/ usar em qquer parte do programa             */
void abreviar(){
    int j,i=1,w=0,q;
    char k;

    for(j=0;j<nome[j]!='\0';j++){            /* percorrer toda a string                                   */
        if(nome[j]==' '){                    /* encontrando um espaço                                     */
            if(nome[j+1]==' '||nome[j+2]==' '||nome[j+3]==' '||nome[j+4]==' '){
                                             /* se algum dos próximos 4 caract for um espaço              */
                while(nome[j+i]!=' ')i++;    /* conta quantos caracteres até o espaço                     */
                for(q=j;nome[q+i]!='\0';q++){/* percorrer a string desse ponto até o final                */
                    nome[q]=nome[q+i];       /* puxa os carateres da string para traz eliminando          */
                                             /* caracteres indesejáveis                                   */
                }
                nome[q]='\0';                /* marca o novo final da string para poder usar o            */
                                             /* comando strlen                                            */
            }
        }
    }
    for(j=strlen(nome);j>=0;j--){            /* lê a string do final para o começo                        */
        if(nome[j]==' '){                    /* encontrando um espaço , aí está o último sobrenome        */
            printf("%c",toupper(nome[j+1])); /* imprime o 1º carc do último sobrenome em maiúsculo        */
            for(i=j+2;nome[i]!='\0';i++){    /* até encontrar o final da string " \0 "                    */
                printf("%c",nome[i]);        /* imprime cada caractere do último sobrenome                */
            }
            printf(", ");                     /* imprime uma vírgula depois do último sobrenome           */
            for(i=0;i<j+1;i++){               /* percorrer as string do começo até aquele último espaço   */
                if(w==0)k=nome[i];            /* pega o primeiro cract do nome edos outros sobrenomes     */
                w++;          /* modifica o valor , para não pegar os outro caracteres de mesmo sobrenome */
                if(nome[i]==' '){             /* encontrando outro espaço                                 */
                    w=0;           /* volta o valor à zero para pegar o primeiro caract do próx sobrenome */
                    printf("%c. ",toupper(k));/* imprime o carac daquele sobrenome em maiúculo e um ponto */
                }
            }
            break;                            /* sai desse loop , pois já imprimiu todos os sobrenomes    */
        }
    }
}
int main(){
    int j,n;
    printf("Quantos Nomes ");
    scanf("%d",&n);
    printf("%d\n",n);
    for(j=0;j<n;j++){
        printf("O Nome -> ");
        fflush(stdin);
        gets(nome);
        printf("\n");
        abreviar();
        printf("\n\n");
    }
    getch();
    return 0;
}

 

  • Obrigado 1

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!