Ir ao conteúdo
  • Cadastre-se

C What does it mean in scanf C?


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

What does %[^\n] mean in C? I saw it in a program which uses scanf for taking multiple word input into a string variable. I don't understand though because I learned that scanf can't take multiple words.

Here is the ex code:

			system("cls");
			for (i=0; i<TAM; i++)
			{
				printf("digite o código do livro da posição %d", i+1);
				scanf("%d", &ficha[i].codigo);
				fflush(stdin);
				printf("Digite o título do livro: ");
				scanf("%50[^\n]s", &ficha.titulo); //
				fflush(stdin);
				printf("Digite o nome do autor; "); //
				scanf("%30[^\n]s")
            }                 

 

Link para o comentário
Compartilhar em outros sites

  • Solução

@AnonymousLPH Por que fez a postagem em inglês?

Nevermind... kk

Respondi essa pergunta ontem em uma postagem, vou só copiar e colar a resposta:

%[] é um identificador mais específico que o %s.

Com o %[], você pode escolher o que quer ler.

Dentro dos parênteses, você escreve os caracteres permitidos. A diferença é que para negar, você coloca um ^ antes dos caracteres.

com %[^\n], a string será lida até encontrar o \n que, nesse caso, é o enter que damos ao terminar de digitar. \n é o caractere negado, ou seja, tudo além dele será lido.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH O que você considera como melhor?

Não tenho ideia do que você está tentando fazer, não sei de que programa se trata. Se quer ler uma string com algumas palavras, pode usar o identificador daquela maneira que funciona, ele vai ler tudo até encontrar o \n. Se quiser usar alguma outra coisa, fique à vontade.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues Vi em um post que tem vários problemas :

Citação

Common problems with scanf("%[^\n]",line); 1) It does not limit input, so in this case, input text 100 characters or more can overflow the line[] buffer. 2) If the first character encountered is a '\n', nothing is changed about line[] and the function returns 0. 3) The '\n' remains in stdin. Save yourself future problems, do not use scanf("%[^\n]",line); Research and use fgets() instead.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH Isso é um problema específico de um programa específico.

%[^\n] não limita a quantidade de caracteres com a qual você pode entrar, mas em seu código, você mesmo já limitou.

Você pode inserir um número após o % para limitar, lembrando que deve deixar espaço para o NULL (\0).

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH

14 minutos atrás, AnonymousLPH disse:

achei que %50 fosse alguma dimensão de char

Se, por exemplo, você declarar:

char frase[51];

O identificador poderia ser %50[^\n]s, porque você conseguiria entrar com até 50 caracteres e ainda sobraria espaço para o caractere NULL.

22 minutos atrás, AnonymousLPH disse:

If the first character encountered is a '\n', nothing is changed about line[] and the function returns 0.

Se você não der um enter antes de inserir a string, fica tudo bem.

Qualquer \n que estiver presente na string, encerra a leitura.

22 minutos atrás, AnonymousLPH disse:

Save yourself future problems, do not use scanf("%[^\n]",line); Research and use fgets() instead.

Me parece que o autor dessa resposta está querendo vender fgets() como um produto que pretende revolucionar sua vida e seus programas kk

Dê uma olhada nessa função sim, é interessante, mas não há nenhum problema gigantesco com scanf().

22 minutos atrás, AnonymousLPH disse:

The '\n' remains in stdin

Caso você queira \n em sua string, daí sim é um problema.

22 minutos atrás, AnonymousLPH disse:

It does not limit input, so in this case, input text 100 characters or more can overflow the line[] buffer.

"in this case". Como se não houvesse maneira alguma de limitar... Só confirma minha hipótese de que ele está tentando vender fgets() kk

Tem sim como limitar, como eu havia explicado na resposta anterior, mas o autor da resposta nem sequer comentou sobre.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@AnonymousLPH Espaço é espaço, \n é \n.

São 2 caracteres diferentes, \n representa a quebra de linha.

Caso queira usar o fgets(), pode fazer o seguinte:

char texto[51];
fgets(texto, 50, stdin);
5 minutos atrás, AnonymousLPH disse:

Um exemplo seria, se eu quisesse um texto em parágrafos?

Você diz, inserir frases intercaladas por \n? Sim, seria um problema.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

33 minutos atrás, AnonymousLPH disse:

Common problems with scanf("%[^\n]",line); 1) It does not limit input, so in this case, input text 100 characters or more can overflow the line[] buffer. 2) If the first character encountered is a '\n', nothing is changed about line[] and the function returns 0. 3) The '\n' remains in stdin. Save yourself future problems, do not use scanf("%[^\n]",line); Research and use fgets() instead

 

People can write nonsense stuff in any language.

 

Esqueça. 

 

scanf() foi escrita para tratar entrada formatada --- scan formatted input --- e não para ler do teclado. É uma rotina poderosa, mas acabou sendo usada para ler entrada do teclado, que é tudo menos formatada --- free form, o cara digita o que quiser --- e a mecânica sequer é explicada direito pelos instrutores pelo visto, e em geral nem pelos livros.

 

"%[^\n]" 

 

Esse é um caso de um modificador genérico. Se você usasse %[12345] scanf() aceitaria um grupo desses caracteres e pararia no primeiro diferente. Se você usasse %[^123X45] scanf() aceitaria tudo até ver um desses símbolos.

Se você usasse um número antes limitaria o tamanho da string a ser lida, contrariando o texto citado.

 

"'\n' remains in stdin " não conta a história toda: scanf() é uma rotina ativa: ela consome dados da entrada e para em um tab espaço ou newline. O que não foi consumido fica no buffer. Trata-se na noção de stream, que é o caso de stdin ou de arquivos desse tipo: eles tem um buffer. Uma rotina não pode excluir nada do buffer. Um '\n'não é lixo. Limpar o buffer como já li aqui pode não nada certo. Imagine várias rotinas lendo do mesmo arquivo por exemplo...

 

scanf() retorna o número de valores lidos e deveria ser usado SEMPRE e é raro se ver isso em programas de estudantes e mesmo de profissionais...

 

É uma longa história, mas não é essa que viu nesse texto aí.

 

Eu postei muitos exemplos de uso de scanf() aqui, acho que pode consultar clicando no meu nome.

 

De todo modo entenda que essas rotinas não foram escritas para ler do teclado. Se quer ler do teclado com controle a solução é conhecida:

  • leia letra a letra, mas não mostre
  • monte uma string com o valor lido de acordo com o que precisa ler
  • só mostra  a letra e avança o cursor se era algo válido
  • ao terminar o campo converta para o formato desejado, tipo string, float, inteiro...

 

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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