Ir ao conteúdo
  • Cadastre-se

Recebendo String com espaço


Posts recomendados

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

  • Curtir 1
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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