Jump to content
Fórum Script Brasil
  • 0
Sign in to follow this  
bleszerd

Problema ao ler strings com o scanf

Question

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)

 

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
  • 0
10 horas atrás, vangodp disse:

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.

Obrigado, deu tudo certo :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Cloud Computing


  • Forum Statistics

    • Total Topics
      148417
    • Total Posts
      643832
×
×
  • Create New...