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:  
Pedro Augusto Alcantara

Recebendo String com espaço

Recommended Posts

Olá senhores (a), estou com um problema para receber string, já pesquisei em todos os lugares, usei puts, gets, etc, e dá sempre o mesmo erro, quando chega no menu de cadastro, ele pula as opções que recebe string. segue o código:

 

 

 

#include <stdio.h>
#define MAX 999
void cadastro();
int opcao;
char nomeproduto[MAX][90], modelo [MAX][90], marca[MAX][90];
int ano[MAX], estoque[MAX][MAX];
float preco[MAX];
int main (){
    
    do {
    printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²²² Odebrech Equipamentos ²²²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²²²²²²² MENU ²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²²                                   ²²²\n");
printf("\t\t²²²    1- Cadastrar produto           ²²²\n");
printf("\t\t²²²    2- Listar todas os produtos    ²²²\n");
printf("\t\t²²²    3- Buscar produto              ²²²\n");
printf("\t\t²²²    4- Editar dados do produto     ²²²\n");
printf("\t\t²²²    5- Excuir produto              ²²²\n");
printf("\t\t²²²    6- Função compra/venda         ²²²\n");
printf("\t\t²²²    7- Sair                        ²²²\n");
printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²² INFORME A OPCAO ²²²²²²²²²²²\n");
printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
printf("\t\t²²² OPCAO ²²²: ");
scanf ("%i", &opcao);
    switch (opcao){
            case 1:
            cadastro();
            break;
            default:
            printf ("\n Opção Inválida! Tente novamente\n");
            break;
    }} while (opcao !=4);
    
}


void cadastro(){
    int linha=0;
    

 printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
 printf("\t\t²²²²²²²²²²²² CADASTRO DE PRODUTO ²²²²²²²²²²²²\n");
 printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");

    printf ("Digite o nome do produto: ");
    scanf ("%[^\n]", nomeproduto[linha])
    printf ("\nDigite a marca do produto: ");
    scanf ("%[^\n]", marca[linha]);
    printf ("\nDigite o Modelo do produto: ");
    scanf ("%[^\n]", modelo[linha]);
    printf ("\nDigite o ano de fabricação: ");
    scanf ("%i", &ano[linha]);
    printf ("\nDigite a quantidade no estoque: ");
    scanf ("%i", &estoque[linha]);
    printf ("\nDigite o preco: ");
    scanf ("%f", &preco[linha]);
    linha++;
}

Captura de tela de 2017-07-01 00-10-34.png

Editado por Pedro Augusto Alcantara
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Pedro Augusto Alcantara
Rapaz, você esqueceu de declarar o tipo de variavel!
Exemplo: 

 printf ("Digite o nome do produto: ");
    scanf ("%[^\n]", nomeproduto[linha]);
A parte sublinhada devia estar %s!!
E outra, para usar string, você deve utilizar a biblioteca #include<string.h>
Tenta ae!
 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 4 minutos atrás, Lobarinhas disse:

    @Pedro Augusto Alcantara
    Rapaz, você esqueceu de declarar o tipo de variavel!
    Exemplo: 

     printf ("Digite o nome do produto: ");
        scanf ("%[^\n]", nomeproduto[linha]);
    A parte sublinhada devia estar %s!!
    E outra, para usar string, você deve utilizar a biblioteca #include<string.h>
    Tenta ae!
     

    Obrigado pelas dicas.

    Eu usei dessa forma:

    printf ("Digite o nome do produto: ");
        scanf ("%[%s^\n]", nomeproduto[linha]);

     

    porém tá dando Loop infinito!

    errei em algum lugar?

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Pedro Augusto Alcantara É o seu /n!
    você deve estar usando para poder aplicar nome composto a sua variavel, certo ?

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Pedro Augusto Alcantara Neste caso, você pode utilizar o comando fflush(stdin) ao final de cada scanf!
    Exemplo

     

        printf ("Digite o nome do produto: ");
        scanf ("%s", nomeproduto[linha]);
        fflush(stdin);

     

    Apos cada scanf, você mete um fflush desses.
    Ver se te ajuda!

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 5 minutos atrás, Lobarinhas disse:

    @Pedro Augusto Alcantara Neste caso, você pode utilizar o comando fflush(stdin) ao final de cada scanf!
    Exemplo

     

    
        printf ("Digite o nome do produto: ");
        scanf ("%s", nomeproduto[linha]);
        fflush(stdin);

     

    Apos cada scanf, você mete um fflush desses.
    Ver se te ajuda!

    Fiz, mas continua pegando apenas a 1 palavra antes do espaço.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Pedro Augusto Alcantara De uma olhada dessa maneira:

     

     printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
     printf("\t\t²²²²²²²²²²²² CADASTRO DE PRODUTO ²²²²²²²²²²²²\n");
     printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf ("Digite o nome do produto: ");
        scanf ("%s", nomeproduto[linha]);
        fflush(stdin);
        printf ("\nDigite a marca do produto: ");
        scanf ("%s", marca[linha]);
        fflush(stdin);
        printf ("\nDigite o Modelo do produto: ");
        scanf ("%s", modelo[linha]);
        fflush(stdin);
        printf ("\nDigite o ano de fabricação: ");
        scanf ("%d", &ano[linha]);
        printf ("\nDigite a quantidade no estoque: ");
        scanf ("%d", &estoque[linha]);
        printf ("\nDigite o preco: ");
        scanf ("%f", &preco[linha]);
        linha++;
        fflush(stdin);

    Outra coisa que não havia reparado ... seus leitores inteiros estavam como %i! Não sei se funciona normal, mas alterei para %d só para manter padrãozinho mesmo!

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 2 minutos atrás, Lobarinhas disse:

    @Pedro Augusto Alcantara De uma olhada dessa maneira:

     

    
     printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
     printf("\t\t²²²²²²²²²²²² CADASTRO DE PRODUTO ²²²²²²²²²²²²\n");
     printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf ("Digite o nome do produto: ");
        scanf ("%s", nomeproduto[linha]);
        fflush(stdin);
        printf ("\nDigite a marca do produto: ");
        scanf ("%s", marca[linha]);
        fflush(stdin);
        printf ("\nDigite o Modelo do produto: ");
        scanf ("%s", modelo[linha]);
        fflush(stdin);
        printf ("\nDigite o ano de fabricação: ");
        scanf ("%d", &ano[linha]);
        printf ("\nDigite a quantidade no estoque: ");
        scanf ("%d", &estoque[linha]);
        printf ("\nDigite o preco: ");
        scanf ("%f", &preco[linha]);
        linha++;
        fflush(stdin);

    Outra coisa que não havia reparado ... seus leitores inteiros estavam como %i! Não sei se funciona normal, mas alterei para %d só para manter padrãozinho mesmo!

    Até funciona, mas não resolve o problema :(

    A função Scanf só pega o primeiro nome

    depois do espaço não pega mais nada

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    @Pedro Augusto Alcantara  altera os comandos fflush(stdin) para _flushall(); 
    Agora tem que ir! Raios hahahahahahaha

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Pronto modifiquei e agora está funcionando.

    #include <stdio.h>
    
    #define MAX 999
    
    int opcao;
    char nomeproduto[MAX][90], modelo[MAX][90], marca[MAX][90];
    int ano[MAX], estoque[MAX][MAX];
    float preco[MAX];
    int linha = 0;
    
    
    void flushstdin();
    
    void cadastro();
    
    int main() {
    
        do {
            printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²² Odebrech Equipamentos ²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²² MENU ²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²                                   ²²²\n");
            printf("\t\t²²²    1- Cadastrar produto           ²²²\n");
            printf("\t\t²²²    2- Listar todas os produtos    ²²²\n");
            printf("\t\t²²²    3- Buscar produto              ²²²\n");
            printf("\t\t²²²    4- Editar dados do produto     ²²²\n");
            printf("\t\t²²²    5- Excuir produto              ²²²\n");
            printf("\t\t²²²    6- Função compra/venda         ²²²\n");
            printf("\t\t²²²    7- Sair                        ²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²² INFORME A OPCAO ²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²² OPCAO ²²²: ");
            scanf("%i", &opcao);
            flushstdin();
            switch (opcao) {
                case 1:
                    cadastro();
                    break;
                default:
                    printf("\n Opção Inválida! Tente novamente\n");
                    break;
            }
        } while (opcao != 7);
    
        return 0;
    }
    
    void flushstdin(){
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
    }
    
    void cadastro() {
        printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf("\t\t²²²²²²²²²²²² CADASTRO DE PRODUTO ²²²²²²²²²²²²\n");
        printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf("Digite o nome do produto: ");
        scanf("%[^\n]", nomeproduto[linha]);
        flushstdin();
        printf("\nDigite a marca do produto: ");
        scanf("%[^\n]", marca[linha]);
        flushstdin();
        printf("\nDigite o Modelo do produto: ");
        scanf("%[^\n]", modelo[linha]);
        flushstdin();
        printf("\nDigite o ano de fabricação: ");
        scanf("%i", &ano[linha]);
        flushstdin();
        printf("\nDigite a quantidade no estoque: ");
        scanf("%i", &estoque[linha]);
        flushstdin();
        printf("\nDigite o preco: ");
        scanf("%f", &preco[linha]);
        flushstdin();
        linha++;
    }

    Os scanf("%[^\n]", marca[linha]); estavam corretos, não tinha necessidade de modificar, só precisava limpar os '\n' que estavam ficando sobrando na stdin depois que cada scanf() era executado, incluí uma função pra fazer isso e usei ela após cada scanf() pra corrigir.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 9 minutos atrás, isrnick disse:

    Pronto modifiquei e agora está funcionando.

    
    #include <stdio.h>
    
    #define MAX 999
    
    int opcao;
    char nomeproduto[MAX][90], modelo[MAX][90], marca[MAX][90];
    int ano[MAX], estoque[MAX][MAX];
    float preco[MAX];
    int linha = 0;
    
    
    void flushstdin();
    
    void cadastro();
    
    int main() {
    
        do {
            printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²² Odebrech Equipamentos ²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²² MENU ²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²                                   ²²²\n");
            printf("\t\t²²²    1- Cadastrar produto           ²²²\n");
            printf("\t\t²²²    2- Listar todas os produtos    ²²²\n");
            printf("\t\t²²²    3- Buscar produto              ²²²\n");
            printf("\t\t²²²    4- Editar dados do produto     ²²²\n");
            printf("\t\t²²²    5- Excuir produto              ²²²\n");
            printf("\t\t²²²    6- Função compra/venda         ²²²\n");
            printf("\t\t²²²    7- Sair                        ²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²² INFORME A OPCAO ²²²²²²²²²²²\n");
            printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
            printf("\t\t²²² OPCAO ²²²: ");
            scanf("%i", &opcao);
            flushstdin();
            switch (opcao) {
                case 1:
                    cadastro();
                    break;
                default:
                    printf("\n Opção Inválida! Tente novamente\n");
                    break;
            }
        } while (opcao != 7);
    
        return 0;
    }
    
    void flushstdin(){
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
    }
    
    void cadastro() {
        printf("\n\n\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf("\t\t²²²²²²²²²²²² CADASTRO DE PRODUTO ²²²²²²²²²²²²\n");
        printf("\t\t²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²\n");
        printf("Digite o nome do produto: ");
        scanf("%[^\n]", nomeproduto[linha]);
        flushstdin();
        printf("\nDigite a marca do produto: ");
        scanf("%[^\n]", marca[linha]);
        flushstdin();
        printf("\nDigite o Modelo do produto: ");
        scanf("%[^\n]", modelo[linha]);
        flushstdin();
        printf("\nDigite o ano de fabricação: ");
        scanf("%i", &ano[linha]);
        flushstdin();
        printf("\nDigite a quantidade no estoque: ");
        scanf("%i", &estoque[linha]);
        flushstdin();
        printf("\nDigite o preco: ");
        scanf("%f", &preco[linha]);
        flushstdin();
        linha++;
    }

    Os scanf("%[^\n]", marca[linha]); estavam corretos, não tinha necessidade de modificar, só precisava limpar os '\n' que estavam ficando sobrando na stdin depois que cada scanf() era executado, incluí uma função pra fazer isso e usei ela após cada scanf() pra corrigir.

    FUNCIONOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Muito obrigado, velho!!!

     

    agradeço também o Lobarinhas.

    • Curtir 2

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Abaixo tem um post meu com uma explicação do que acontece nesse tipo de situação que gera esse problema, caso queira entender melhor:

    • Curtir 2

    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






    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

    ×