Program.exe stopped working

-2

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

I do not 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!='
#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!='%pre%';i++) //aqui ele pega todos os caracteres do nome completo, até achar um espaço ou o limitador
        nome1[j++] = nomecompleto[i];
    nome1[j]='%pre%'; //adiciona o limitador no final da string nome1

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

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

    if(nomecompleto[i++]=='%pre%') //idem
        break; //idem

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

    if(nomecompleto[i++]=='%pre%')
         break;

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

    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;
';i++) //aqui ele pega todos os caracteres do nome completo, até achar um espaço ou o limitador nome1[j++] = nomecompleto[i]; nome1[j]='%pre%'; //adiciona o limitador no final da string nome1 if(nomecompleto[i++]=='%pre%')//aqui é verificado se tem algum outro nome break; //se não tiver, o while é cortado for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='%pre%';i++) nome2[j++] = nomecompleto[i]; //repete o mesmo que no passo 1 nome2[j]='%pre%'; if(nomecompleto[i++]=='%pre%') //idem break; //idem for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='%pre%';i++) nome3[j++] = nomecompleto[i]; nome3[j]='%pre%'; if(nomecompleto[i++]=='%pre%') break; for(j=0, i++, qntd_palavras++;nomecompleto[i]!=' '&&nomecompleto!='%pre%';i++) nome4[j++] = nomecompleto[i]; nome4[j]='%pre%'; 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;

}

    
asked by anonymous 16.07.2016 / 14:23

1 answer

1
    for(i=0, j=0;nomecompleto[i]!=' '&&nomecompleto!='
    for(i=0, j=0;nomecompleto[i]!=' '&&nomecompleto!='%pre%';i++) //aqui ele pega todos os caracteres do nome completo, até achar um espaço ou o limitador
    //                                 ^^^^^^^^^^^^^^^^^^
        nome1[j++] = nomecompleto[i];
';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.
This pointer will never be NULL (or 'nomecompleto!='%code%'' ) and this part of the condition ( %code% ) will always be true which is not what you expect.

Try to simplify the initialization and conditions of your cycles.

    
18.07.2016 / 11:06