Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
edivaldo777

C Programa em C erros de string

Recommended Posts

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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 		printf("\n\nDigite o Nome: ");
                    scanf("%[^\n]s", &nome[linha]);
    
    ficaria assim?
      
      		printf("\n\nDigite o Nome: ");
    		fflush(stdin);
    		fgets(nome[linha],256,stdin);
         

    poderia usar meu código como exemplo e me mostrar no caso de nome no cadastro de clientes?

    Editado por edivaldo777

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

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

     

     

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    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.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×