Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Frases com espaços

bom dia, fiz um programa que faz um registro, e depois de ter registrado eu listo tudo que foi digitado no programa, mas ao digitar frases com espaço ele só captura a primeira palavra e o restante é deletado.

exp: Digito a frase: Programando em C, o que vai ser registrado é só a palavra "Programando"

#include <stdio.h>

int main(void){

     FILE *file;
     file = fopen("arquivo.txt", "r+");
     char palavra[200];
     int lista;
     scanf("%d", &lista);

    switch(lista){
        case 1:

            scanf("%s", palavra);

            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);
            fprintf(file, "%s\n", &palavra);
            fclose(file);


            break;

        break;
        case 2:

            while(fgets(palavra, 200, file) != NULL){
                printf("%s", palavra);

            }
            fclose(file);
        break;


    }

     return 0;

}
5 respostas

Olá Leveditor.

Isso está acontecendo porque o scanf com o parâmetro %s vai ler a sua string até aparecer um Non-whitespace character isso inclui o Enter (Quebra de linha) que normalmente usamos quando terminamos de digitar, mas também inclui o espaço. Então quando o scanf encontra seu espaço ele para de ler.

Uma solução que encontrei utilizando a documentação foi colocando o colchetes e especificando dentro dele que a nossa leitura deve ser feita até aparecer uma quebra de linha, que é representado pelo carácter \n.

scanf("%[^\n]", palavra);

Porem devemos acrescentar mais uma função o fflush, devemos colocar ele antes do nosso scanf e o que ele vai fazer é limpar a leitura, isso porque quando utilizamos o scanf para ler a opção do programa, ele leu apenas o numero e deixo o \n lá esperando para ser lido, então sem antes limpar nosso segundo scanf vai parar de ler antes de começarmos a digitar.

fflush(stdin);
scanf("%[^\n]", palavra);

O código completo vai ficar assim:

#include <stdio.h>

int main(void){

     FILE *file;
     file = fopen("arquivo.txt", "r+");
     char palavra[200];
     int lista;
     scanf("%d", &lista);

    switch(lista){
        case 1:
            fflush(stdin);
            scanf("%[^\n]", palavra);

            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);
            fprintf(file, "%s\n", &palavra);
            fclose(file);


            break;

        break;
        case 2:

            while(fgets(palavra, 200, file) != NULL){
                printf("%s", palavra);

            }
            fclose(file);
        break;


    }

     return 0;

}

Espero ter ajudado, qualquer duvida não hesite em perguntar.

Bons Estudos.

professor fiz alguns teste e não funcionou, quando eu escrevo e aperto enter ele trava e fecha o programa. Estou fazendo trabalho da faculdade que tem que fazer registro de livros e revistas, e depois ser incluído na lista de livros e revistas . o código que te mandei acima já esta bem maior. Só fiz o teste com o primeiro if

#include <stdio.h>

int main(void){
     printf("----------MENU----------\n");
     printf("1-Fazer registro\n");
     printf("2-Listar Livros\n");
     printf("3-Listar revistas\n");
     printf("4-Listar por caixa\n\n");

     FILE *file;
     FILE *fileN;
     file = fopen("arquivo.txt", "r+");
     fileN = fopen("fileN.txt", "r+");
     char livroN[200];
     char livroB[200];

     char revistaN[200];
     char revistaB[200];

     int lista;
     scanf("%d", &lista);






    switch(lista){
        case 1:
            printf("1-Para registrar um livro\n");
            printf("2-Para registrar uma revista\n");

            int listaN;
            scanf("%d", &listaN);

            //FAZER REGISTRO DE UM LIVRO
            if(listaN == 1){

            printf("Nome do livro: ");
            fflush(stdin);
            scanf("%[^\n]", listaN);

            printf("Nome do autor: ");
            scanf("%[^\n]", livroB);
            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);

            fprintf(file, "\nObra: %s \n", &livroN);
            fprintf(file, "\nAutor: %s", &livroB);
            fclose(file);

            }
            //FAZER REGISTRO DA REVISTA
            else if(listaN == 2){
            printf("Nome da revista: ");
            scanf("%s", revistaN);

            printf("Nome da autor: ");
            scanf("%s", revistaB);
            fseek(fileN, 0, SEEK_SET);
            fseek(fileN, 0, SEEK_END);
            fprintf(fileN, "\n\nObra: %s \n", &revistaN);
            fprintf(fileN, "Autor: %s ", &revistaB);
            fclose(fileN);
            }

            break;
        case 2:

            while(fgets(livroN, 200, file) != NULL){

                printf(" %s", livroN);
            }
            fclose(file);
        break;

        case 3:

            while(fgets(revistaN, 200, fileN) != NULL){
                printf(" %s", revistaN);
            }
            fclose(fileN);
        break;

        case 4: 

          printf("1-Caixa 1\n2-Caixa 2\n3-Caixa 3");

            int caixa;
            scanf("%d", &caixa);
             if(caixa == 1){
                 printf("livro1\n");
                 printf("livro2\n");
                 printf("livro3\n");
                 printf("livro4\n");
             }else if(caixa == 2){
                 printf("livro5\n");
                 printf("livro6\n");
                 printf("livro7\n");
                 printf("livro8\n");
             }
             else if(caixa == 3){
                 printf("livro9\n");
                 printf("livro10\n");
                 printf("livro11\n");
                 printf("livro11\n");
             }
        break;

    }

     return 0;

}

Olá Leveditor.

Acredito que você colocou a variável errada, no lugar de listaN você deveria colocar livroN. O programa está fechando porque você está tentando salvar um vetor char em uma variável do tipo int.

            //FAZER REGISTRO DE UM LIVRO
            if(listaN == 1){

            printf("Nome do livro: ");
            fflush(stdin);
            scanf("%[^\n]", listaN);

            printf("Nome do autor: ");
            scanf("%[^\n]", livroB);
            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);

Ficando desse assim esse trecho do código:

            //FAZER REGISTRO DE UM LIVRO
            if(listaN == 1){

            printf("Nome do livro: ");
            fflush(stdin);
            scanf("%[^\n]", livroN);

            printf("Nome do autor: ");
            fflush(stdin);
            scanf("%[^\n]", livroB);
            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);

E volto a frisar a importância de incluir o fflush(stdin); , ele vai garantir que nenhuma quebra de linha atrapalhe a leitura do seu scanf.

Fiz a modificação do restante do código:

#include <stdio.h>

int main(void){
     printf("----------MENU----------\n");
     printf("1-Fazer registro\n");
     printf("2-Listar Livros\n");
     printf("3-Listar revistas\n");
     printf("4-Listar por caixa\n\n");

     FILE *file;
     FILE *fileN;
     file = fopen("arquivo.txt", "a+");
     fileN = fopen("fileN.txt", "a+");
     char livroN[200];
     char livroB[200];

     char revistaN[200];
     char revistaB[200];

     int lista;
     scanf("%d", &lista);

    switch(lista){
        case 1:
            printf("1-Para registrar um livro\n");
            printf("2-Para registrar uma revista\n");

            int listaN;
            scanf("%d", &listaN);

            //FAZER REGISTRO DE UM LIVRO
            if(listaN == 1){

            printf("Nome do livro: ");
            fflush(stdin);
            scanf("%[^\n]", livroN);

            printf("Nome do autor: ");
            fflush(stdin);
            scanf("%[^\n]", livroB);
            fseek(file, 0, SEEK_SET);
            fseek(file, 0, SEEK_END);

            fprintf(file, "\nObra: %s \n", &livroN);
            fprintf(file, "\nAutor: %s", &livroB);
            fclose(file);

            }
            //FAZER REGISTRO DA REVISTA
            else if(listaN == 2){
            printf("Nome da revista: ");
            fflush(stdin);
            scanf("%[^\n]", revistaN);

            printf("Nome da autor: ");
            fflush(stdin);
            scanf("%[^\n]", revistaB);
            fseek(fileN, 0, SEEK_SET);
            fseek(fileN, 0, SEEK_END);
            fprintf(fileN, "\n\nObra: %s \n", &revistaN);
            fprintf(fileN, "Autor: %s ", &revistaB);
            fclose(fileN);
            }

            break;
        case 2:

            while(fgets(livroN, 200, file) != NULL){

                printf(" %s", livroN);
            }
            fclose(file);
        break;

        case 3:

            while(fgets(revistaN, 200, fileN) != NULL){
                printf(" %s", revistaN);
            }
            fclose(fileN);
        break;

        case 4: 

          printf("1-Caixa 1\n2-Caixa 2\n3-Caixa 3");

            int caixa;
            scanf("%d", &caixa);
             if(caixa == 1){
                 printf("livro1\n");
                 printf("livro2\n");
                 printf("livro3\n");
                 printf("livro4\n");
             }else if(caixa == 2){
                 printf("livro5\n");
                 printf("livro6\n");
                 printf("livro7\n");
                 printf("livro8\n");
             }
             else if(caixa == 3){
                 printf("livro9\n");
                 printf("livro10\n");
                 printf("livro11\n");
                 printf("livro11\n");
             }
        break;

    }

     return 0;

}

Outra alteração que recomendo é utilizar o mode r+ para abrir o arquivo, nesse modo o arquivo é criado caso ele não exista, pode ver detalhes dos modos de leitura na documentação.

     file = fopen("arquivo.txt", "a+");
     fileN = fopen("fileN.txt", "a+");

Qualquer problema ou duvida pode falar.

Bons Estudos.

Obrigado professor funcionou, só mais uma pergunta existe algum comando que ao terminar de fazer o registro ele volta para o menu. Pois quando eu termino de fazer o registro ele fecha

solução

Olá Leveditor.

Existem diversas maneira de fazer isso, uma delas seria utilizando a estrutura de repetição While, ela repete o bloco de código dentro dela enquanto alguma condição.

do{
    BLOCO QUE VAI SER REPETIDO
}while(CONDIÇÃO)

Então vamos colocar todo o seu código que está dentro do main, dentro desse While, apenas o return 0; vai ficar de fora porque é ele que finaliza o seu código.

#include <stdio.h>

int main(void){
    do{
        printf("\n----------MENU----------\n");
        printf("1-Fazer registro\n");
        printf("2-Listar Livros\n");
        printf("3-Listar revistas\n");
        printf("4-Listar por caixa\n\n");
..........................................................................................
                else if(caixa == 3){
                    printf("livro9\n");
                    printf("livro10\n");
                    printf("livro11\n");
                    printf("livro11\n");
                }
            break;

        }
    }while(True);
    return 0;
}

* Coloquei apenas parte do código para a resposta não ficar tão extensa.

Optei por utilizar a variação do While o DO While, a diferença entre eles, é que o segundo executa pelo menos uma vez.

Atualmente seu código vai se repetir para sempre porque a condição dentro do While não vai variar, ela sempre será verdadeira.

  }while(True);

Para melhorar isso recomendo colocar uma opção no seu menu que represente a opção de sair do sistema.

        printf("\n----------MENU----------\n");
        printf("1-Fazer registro\n");
        printf("2-Listar Livros\n");
        printf("3-Listar revistas\n");
        printf("4-Listar por caixa\n");
        printf("5-Sair\n\n");

Por exemplo se o usuário digitar a opção 5 vai encerrar o programa.

  }while(lista != 5);

Então aqui estamos dizendo que enquanto o valor lista for diferente de 5 o programa deve rodar todo esse bloco novamente.

Porem nesse momento geramos um problema, porque a variável lista está dentro do bloco do While e assim o código em C não vai enxerga-la, para resolver devemos declarar a variável lista fora do While.

#include <stdio.h>

int main(void){
    int lista;
    do{

Dessa maneira garantimos que nosso While vai enxergar a variável. Espero ter ajudado, mas qualquer duvida não hesite em perguntar.

Bons Estudos.