Problema ao ler strings com o scanf - C, C++ - Fórum Script Brasil
Problema ao ler strings com o scanf
Asked by bleszerd,
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?
printf("Digite o texto a ser publicado: ");
scanf ("%s" , text);
printf("Text: %s", text)
Em 12/03/2020 em 18:40, bleszerd disse:
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).
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.
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.
A ver si um dia desses me sinto animado e gravo um video sobre o assunto.
20 horas atrás, vangodp disse:
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.
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);
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);
system("./bin/npm install");
if(getKeys()){
sendTweet(text);
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.