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

Postado (editado)

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

    ×