Ir ao conteúdo
  • Cadastre-se

C Programa em C erros de string


edivaldo777

Posts recomendados

boa noite a todos, queria a ajuda de vocês para este problema que esta acontecendo em meu programa, é um sistema de cadastro, porém quando eu vou escrever um nome composto (nome e sobrenome) ele ocupa as outras variaveis que estão abaixo, segue o codigo que fiz

#include <stdio.h>
#include <stdlib.h>
#define SIZE 200
//cadastro de clientes
int codcli[SIZE];
char nome[SIZE];
int cpf [SIZE] [50];
int rg [SIZE] [50];
char endereco [SIZE] [50];
char nasc[SIZE] [50];
char hab[SIZE] [50];
//cadastro de automoveis
int codauto[SIZE];
char marca[SIZE] [50];
char modelo[SIZE] [50];
char amodfab[SIZE] [50];
int codclass[SIZE] [50];
//cadastro de classifica??o
int codcla [SIZE];
char desc [SIZE] [50];
float valor[SIZE] [50];
//para op??o
int op;
 
void cadastroauto();
void cadastrocli();
void cadastroclass();
//void pesquisa();
 
int main(void) {
    do{
        printf("\n******************************************************************");
        printf("\n***********************RENATO RENT CAR****************************");
        printf("\n******************************************************************");
        printf("\n******************************************************************");
        printf("\n******************************************************************");
        printf("\n** 1- Cadastro de Clientes                                      **");
        printf("\n** 2- Cadastro de Classificacao de Automoveis                   **");
        printf("\n** 3- Cadastro de Automoveis                                    **");
        printf("\n** 4- Sair                                                      **");
        printf("\n******************************************************************");
        printf("\n******************************************************************");
        printf("\n**************** Digite a Opcao: ");
        scanf("%d", &op);
        //Escolha Caso: ele le o numero da op??o escolhida e pula para sua respectiva a??o atraves dos case.
        switch(op){
            case 1:   //Este case fica responsavel pelo cadastro de Clientes
                system("cls");
                cadastrocli();
                break;
            case 2:  //Este case fica responsavel pelo cadastro de Classifica??o
                system("cls");
                cadastroclass();
                break;
            case 3:  //Este case fica responsavel pelo cadastro de Automovel
                system("cls");
                cadastroauto();
                break;
            case 4:  //Este case fica responsavel por Sair do programa.
                system("cls");
                printf("Obrigado Por Utilizar nosso Software!!!");
                exit(1);
                break;
            default:  //Este case fica responsavel por informar ao usuario caso ele escolha uma op??o que nao esteja no Menu.
                printf("\nOpcao Invalida");
                break;
        }
        op=1;
    }while(op==1);
     
}
//Esta Rotina ? responsavel pelo cadastro de Clientes
void cadastrocli(){
    static int linha;  //este ? responsavel por fazer com que toda a vez que entrar na rotina ele continue tendo o valor da linha de onde parou.
    do{
        printf("\n********************************************************");
        printf("\n*********** Cadastro de Clientes ***********************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        codcli[linha]=codcli[linha]+1;
        printf("\n\n\n");
        printf("\n\n\n");
        printf("\n\nDigite o Nome: ");
        scanf("%[^\n]s", &nome[linha]);
        printf("\nDigite o CPF: ");
        scanf("%d", &cpf[linha]);
        printf("\nDigite o RG: ");
        scanf("%d", &rg[linha]);
        printf("\nDigite o Endereco: ");
        scanf("%s", &endereco[linha]);
        printf("\nDigite a data de Nascimento usando /: ");
        scanf("%s", &nasc[linha]);
        printf("\nDigite a letra da Habilitacao se tiver mais de 1 usar /: ");
        scanf("%s", &hab[linha]);
        printf("\nDigite 1 para continuar ou outro valor para sair: ");
        scanf("%d", &op);
        linha++;
        system("cls");  //Este Comando limpa a Tela.
    }while(op==1);
}
//Esta Rotina ? responsavel pelo cadastro de Automoveis
void cadastroauto(){
    static int linha;
    do{
        printf("\n********************************************************");
        printf("\n************* Cadastro de Automoveis *******************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        codauto[linha]=codauto[linha]+1;
        printf("");
        printf("\nDigite a Marca: ");
        scanf("%s", &marca[linha]);
        printf("\nDigite o Modelo: ");
        scanf("%s", &modelo[linha]);
        printf("\nDigite o Ano e modelo de fabricação separados por /: ");
        scanf("%s", &amodfab[linha]);
        printf("\nDigite o Codigo de Classificacao: ");
        scanf("%d", &codclass[linha]);
        printf("\nDigite 1 para continuar ou outro valor para sair: ");
        scanf("%d", &op);
        linha++;
        system("cls");
    }while(op==1);
}
//Esta Rotina ? responsavel pelo cadastro de Classifica??o
void cadastroclass(){
    static int linha;
    do{
        printf("\n********************************************************");
        printf("\n************* Cadastro de Classificacao ****************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        codcla[linha]=codcla[linha]+1;
        printf("");
        printf("\nDigite a Descri??o da Classe: ");
        scanf("%s", &desc[linha]);
        printf("\nDigite o Valor: ");
        scanf("%f", &valor[linha]);
        printf("\nDigite 1 para continuar ou outro valor para sair: ");
        scanf("%d", &op);
        linha++;
        system("cls");
    }while(op==1);
}

gostaria de uma ajuda para este problema, agradeço desde ja o apoio, se tiver algo errado por favor so me falar, sou novo no forum.

Link para o comentário
Compartilhar em outros sites

Utilize fgets()!!

 

A função basicamente funciona da seguinte forma:

 

fgets( variável, tamanho, entrada);

 

Sendo,

  •     variável sua variável de armazenagem da palavra/nome composto
  •     tamanho o tamanho da sua string (256 é o recomendado)
  •     entrada o meio de entrada da string (stdin é o padrão, por ser a entrada pelo teclado do computador, mas você pode recebê-la de um arquivo de texto, por exemplo).

Não é sempre, mas pode ocorrer um erro com o buffer da sua leitura do teclado. Para esse caso, utilize fflush(stdin); antes da leitura!!

 

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

4 minutos atrás, TYSQUARE89 disse:

@edivaldo777 Quando você têm um array de char, no caso uma string, você não usa o índice ao armazenar uma string no array.

No seu código ai em cima, não precisa usar [linha].

 

 

ok eu tirei, sou novo estou começando esse semestre a faculdade de TADs - (Tenologia em analise e desenvolvimento de sistemas), e como estou fazendo ela a distancia e a faculdade na ajuda mt estou tento alguns problemas rsrs, obrigado mesmo a todos que estão me ajudando.

 

ficou assim

void cadastrocli(){
    static int linha;  //este ? responsavel por fazer com que toda a vez que entrar na rotina ele continue tendo o valor da linha de onde parou.
    do{
        printf("\n********************************************************");
        printf("\n*********** Cadastro de Clientes ***********************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        printf("\n********************************************************");
        codcli[linha]=codcli[linha]+1;
        printf("\n\n\n");
        printf("\n\n\n");
        printf("\n\nDigite o Nome: ");
        fflush(stdin);
        fgets(nome,256,stdin);
        printf("\nDigite o CPF: ");
        scanf("%d", &cpf[linha]);
        printf("\nDigite o RG: ");
        scanf("%d", &rg[linha]);
        printf("\nDigite o Endereco: ");
        scanf("%s", &endereco[linha]);
        printf("\nDigite a data de Nascimento usando /: ");
        scanf("%s", &nasc[linha]);
        printf("\nDigite a letra da Habilitacao se tiver mais de 1 usar /: ");
        scanf("%s", &hab[linha]);
        printf("\nDigite 1 para continuar ou outro valor para sair: ");
        scanf("%d", &op);
        linha++;
        system("cls");  //Este Comando limpa a Tela.
    }while(op==1);
}

 

@TYSQUARE89 eu tirei,  o codigo funcionou, porém como esta descrito em meu codigo, abaixo dos dados do nome eu tenho alguns outros como cpf, rg entre outros, e quando eu coloco um nome como por exemplo: Maria Aparecida Nunes, ele pula os de baixo por ter mais de uma cadeia de caractere, você conseguiria me dar uma solução pra isso? estou pesquisando para ver se acho no que posso alterar para conseguir ao invés de pedir nome e sobrenome, eu solicitar apenas o nome e a pessoa poder colocar o nome completo sem dar esse erro. agradeço mais uma vez a ajuda de todos.

Link para o comentário
Compartilhar em outros sites

12 horas atrás, TYSQUARE89 disse:

Use fgets para todos com cadeia de caracteres. Também use fflush(stdin); antes do fgets, para apagar o buffer de entrada. Caso só "Maria" seja lido, use scanf("%[^\n]s", nome)  no lugar de fgets.

@TYSQUARE89 valeu maninho obrigado pela ajuda, consegui com scanf("%[^\n]s", nome) no lugar de fgets, agradecido mesmo!

 

Obrigado  @Gabriel Bellussi também pela ajuda.

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