Program.exe has stopped working

Asked

Viewed 208 times

-2

I’m doing a program that captures a person’s full name and reproduces it in this format: surname, surname without surname (EX:João Carlos Cunha -> Cunha, João Carlos. Amanda Batista -> Batista, Amanda). Only that the user can type as many names as he wants, I tried to limit up to 4, but the program stops working.

I don’t understand the problem.

Here is the code:

#include <stdio.h>
#include <stdlib.h> //para usar a função system();

int main(void)
{
int j, i, qntd_palavras=1;
char nomecompleto[100], nome1[20], nome2[20], nome3[20], nome4[20];

do
{
    printf("digite um nome completo\n> "); gets(nomecompleto); fflush(stdin); //pega o nome completo

    for(i=0, j=0;nomecompleto[i]!=' '&&nomecompleto!='\0';i++) //aqui ele pega todos os caracteres do nome completo, até achar um espaço ou o limitador
        nome1[j++] = nomecompleto[i];
    nome1[j]='\0'; //adiciona o limitador no final da string nome1

    if(nomecompleto[i++]=='\0')//aqui é verificado se tem algum outro nome
        break; //se não tiver, o while é cortado

    for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='\0';i++)
        nome2[j++] = nomecompleto[i]; //repete o mesmo que no passo 1
    nome2[j]='\0';

    if(nomecompleto[i++]=='\0') //idem
        break; //idem

    for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='\0';i++)
        nome3[j++] = nomecompleto[i];
    nome3[j]='\0';

    if(nomecompleto[i++]=='\0')
         break;

   for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='\0';i++)
        nome4[j++] = nomecompleto[i];
    nome4[j]='\0';

    if(nomecompleto[i++]==' ') //após quatro palavras, se houver mais alguma, o programa acusa erro e limpa a tela
    {
        printf("\n\nERROR: muitas palavras digitadas!\n\n");
        system("cls || clear");
    }
    else
        break;//se não acusar erro, o laço é terminado
}while(1);

switch(qntd_palavras) //aqui vai decidir como vai ser exibido o nome, dependendo da quantidade de palavras
{
    case 1:printf("\n\n> %s\n\n", nome1);
        break;
    case 2:printf("\n\n> %s, %s", nome2, nome1);
        break;
    case 3:printf("\n\n> %s, %s %s", nome3, nome1, nome2);
        break;
    case 4:printf("\n\n> %s, %s %s %s", nome4, nome1, nome2, nome3);
        break;
    default:break;
}
return 0;

}

1 answer

1

    for(i=0, j=0;nomecompleto[i]!=' '&&nomecompleto!='\0';i++) //aqui ele pega todos os caracteres do nome completo, até achar um espaço ou o limitador
    //                                 ^^^^^^^^^^^^^^^^^^
        nome1[j++] = nomecompleto[i];

nomecompleto is an array.
Used in the indicated comparison of for it is converted into a pointer to the first element.
That sharpener will never be NULL (or '\0') and this part of the condition (nomecompleto!='\0') will always be true what is not what you expect.


Try to simplify the boot and conditions of your cycles.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.