Ir para conteúdo
Fórum Script Brasil
  • 0

Problema ao ler strings com o scanf


bleszerd

Pergunta

Olá, estou tendo problema em ler strings com espaços em C, dei uma olhada e vi que a função apenas lê os caracteres antes do espaço, porém desta seguinte forma consegue ler a string toda:

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

Porém quando faço isso ele simplesmente ignora o scanf e continua a execução do programa, já quando tiro o "[^\n]" funciona normalmente para capturar uma string sem espaços. Como faço para ler todo o texto levando em consideração que precisarei utilizar o "\n" para quebrar linhas na string?

 

trecho do código:

printf("Digite o texto a ser publicado: ");
scanf ("%s" , text);
printf("Text: %s", text)

 

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 1
Em 12/03/2020 em 18:40, bleszerd disse:

Olá, estou tendo problema em ler strings com espaços em C, dei uma olhada e vi que a função apenas lê os caracteres antes do espaço, porém desta seguinte forma consegue ler a string toda:

O scanf faz a leitura de uma string até se esbarrar com alguns dos seguintes caracteres:

  • Tabulador: '\t'
  • Espaço: ' '
  • Salto de linha '\n'

Se o scanf encontrar um desses caracteres anteriormente mostrados, ele vai interromper a automaticamente a leitura, permanecendo assim o restante da string no buffer a espera de outra string (Ou int, ou float, ou etc. Depende do especificador que vier no mesmo ou seguinte scanf).

Com o especificador %[^\n]s você esta dizendo que o programa deve ler tudo até se esbarrar com '\n'(Salto de linha), nesse caso ele vai aceitar tudo menos o \n, ou seja ao topar com '\n' ele vai deter a leitura.

Cabe destacar que o caractere ^ é como "NEGAR" o que vier a continuação, que neste caso é "negar a ler o enter", e aceitar tudo o que for o resto(incluído saltos e tabuladores).

 

Em 12/03/2020 em 18:40, bleszerd disse:

Porém quando faço isso ele simplesmente ignora o scanf e continua a execução do programa, já quando tiro o "[^\n]" funciona normalmente para capturar uma string sem espaços. Como faço para ler todo o texto levando em consideração que precisarei utilizar o "\n" para quebrar linhas na string?

Isso certamente é devido a lixo no buffer mas como você não disponibilizou o exemplo completo não posso lhe dizer com certeza. Se quiser compartilhar o código completo talvez seja melhor lhe prestar uma ajuda de maior capacidade.

De todas formas vou lhe dar os casos para saber quando você tem lixo no buffer.

  • Tem outros scanfs anterior a esses? Leu int, chars ou qualquer outra coisa antes desse scanf que deu problema?
  • Limpou o buffer antes de uma nova leitura?
  • usou outras funçoes de leitura como getchar etc?

Esses são os pontos que lembrei, se seu programa tem alguma dessas coisas acima você certamente tem problema de lixo no buffer. Isso se soluciona limpando o buffer.

Espero que lhe sirva de ajuda.

Link para o comentário
Compartilhar em outros sites

  • 1
7 horas atrás, bleszerd disse:

De qualquer forma não sei como faço para limpar o buffer...

O primeiro é deixar claro que existe varias formas de se fazer isso(Limpar o buffer). Neste forum, uma vez, teve um debate muito bom sobre isso: https://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

Não so tem formas de limpar o buffer si não tem vários tips para um programador iniciante. Vai lá e da uma olhada, se tiver duvidas pergunte aqui, ou lá mesmo.

Sorte.

A ver si um dia desses me sinto animado e gravo um video sobre o assunto.

Link para o comentário
Compartilhar em outros sites

  • 0
20 horas atrás, vangodp disse:

Isso certamente é devido a lixo no buffer mas como você não disponibilizou o exemplo completo não posso lhe dizer com certeza. Se quiser compartilhar o código completo talvez seja melhor lhe prestar uma ajuda de maior capacidade.

Eu nem sequer sabia da existência do buffer, você me esclareceu muitas das minhas dúvidas agora. De qualquer forma não sei como faço para limpar o buffer, então segue o código completo.

Eu sou ainda muito novo com C, aceito também ajuda caso algum trecho deste código esteja incorreto.

 

#include <stdio.h>
#include <stdlib.h>

char consKey[25], consSec[50], acessTkn[50], acessTknSec[45], text[280];
int getKeys(){
    printf("Informe sua chave: ");
    scanf("%s", consKey);
    printf("Informe sua chave secreta: ");
    scanf("%s", consSec);
    printf("Informe seu token de acesso: ");
    scanf("%s", acessTkn);
    printf("Informe seu token secreto: ");
    scanf("%s", acessTknSec);

    return 1;
}

void sendTweet(const char* varText){
    char strText[281];
    sprintf(strText, "./bin/node app.js -K %s %s -A %s %s -T %s", consKey, consSec, acessTkn, acessTknSec, text);
    printf(strText);
    system(strText);
}

int main(){
    system("./bin/npm install");
    if(getKeys()){
        while(1){
            printf("Digite o texto a ser publicado: ");
            system("clear");
            scanf("%s", text);
            sendTweet(text);
        }
    }
    return 0;
}

Outra coisa que eu queria aprender é guardar o valor das variáveis em algum outro arquivo para ele sempre buscar os valores de lá caso ainda não existam.

Caso prefira, você também pode fazer o download da minha desorganização completa:

https://drive.google.com/file/d/1lFV8MqKTD7_Rv4m8xfSMnUhZtSqoEeoK/view?usp=sharing

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...