Curso de Programação C | Como ler uma String com a função scanf()? | aula 129
HTML-код
- Опубликовано: 8 фев 2025
- Uma string pode ser lida do teclado facilmente com a função scanf(), mas há dois detalhes que devem ser levados em conta.
O primeiro é que para ler uma string fazemos uso do %s. O segundo é que, até o momento, sempre utilizamos o operador & na frente do nome da variável. Isso é necessário porque a função recebe o endereço de memória onde será salvo o dado lido. Contudo, como veremos mais a frente em nosso curso quando formos estudar ponteiros, o nome de um vetor já é um ponteiro. Assim, não devemos colocar o operador & na frente do nome da variável PARA LER UMA STRING, assim:
char palavras[100];
scanf("%s", palavras);
Ao testar esse código algumas vezes você perceberá que será lido apenas a primeira palavra. Esse é o funcionamento padrão da função scanf() para a leitura de texto, é lido até o primeiro espaço.
Outro problema que pode ocorrer é que, por padrão, a função scanf() não verifica o tamanho do vetor. Assim, se o vetor tem tamanho 20 mas o usuário digita um texto com 40 caracteres, serão ocupadas as 20 posições do vetor, mas também serão ocupadas as 20 posições seguintes (lembra que eu disse que um vetor é sequencial na memória?) que não pertencem ao nosso programa.
Para que isso não ocorra, podemos escrever a função scanf() assim:
char palavras[100];
scanf("%100[^
]", palavras);
O número após a o sinal de % é o tamanho do nosso vetor, ou seja, a quantidade máxima de caracteres que podem ser lidos. Os caracteres entre o par de colchetes altera o funcionamento padrão da função para ler tudo que for digitado ATÉ que o ENTER seja pressionado.
Código disponível em: wagnergaspar.com/
vc é um rei, meu nobre!
Deus te abençoe, mn!
fiquei agarrado nesse scanf maldito, mas deu tudo certo agr!!
Essa aula me fez lembrar isso aqui no sql; ... nome varchar(100)
+1 inscrito, eu sou apaixonado por c++ porém tenho me aventurado no C e essa string quebrou minha cabeça demais kkkkkkk muito obrigado explicação nota 1000
Por nada R.D.G e seja muito bem vindo :)
explicação nota 10
Bom conteúdo!
Obrigado por me esclarecer uma dúvida.
Parabéns belissima aula
Obrigado Fernando :)
você ensina muito bem
Obrigado Aramís 😃
Muito boa explicação!
ótimo conteúdo!
TOP
Valeu Israel
Aula muito boa Professor. Obrigado.
A função scanf sendo assim não daria para usar Expressões Regulares?
Porque em uma expressão regular o [^
] quer dizer: "Qualquer coisa nesta posição que não seja o
".
Meu sonho que desse kkk. Gosto demais de Expressões Regulares kkk.
Fala que dá!!kkkkkk
Obrigado.
kkkkkkk
Então Pedro, é possível fazer algumas coisas bem próximas ao que as expressões regulares permitem fazer, por exemplo:
scanf("%[A-Z0-9]", teste);
Esta instrução irá ler apenas letras maiúsculas e números entre 0 e 9.
Assim, se for digitado "ABACATE123" tudo será lido e salvo na variável teste. Contudo, se for digitado "ABACATEz123", será lido apenas a palavra abacate que está em maiúsculo uma vez que a letra z não pertence ao conjunto especificado.
@@programeseufuturo Que da hora professor!! kkk Vou testar aqui algumas coisas (e ver se não explode o pc!! kkkkk!!) Obrigado Professor
kkkkkkkk
Se explodir a culpa não foi minha em hahaha
Olá professor, tudo bem? Se eu utilizar o scanf desta forma, o certo não seria eu colocar um caractere a menos na leitura por conta do contra barra zero? Então se a palavra tem n letras, calculo n-1.
scanf ("%n-1[^
]") ?
Exato Tialisson, a ideia é exatamente esta.
Aí, sabe aquela pessoa que aprendeu errado (na faculdade inclusive hahaha) e agora sempre esquece de corrigir? Pois é, sou eu kkkkk.
Obrigado pela pergunta. Acho que dá uma boa aula aqui pra canal até pra me corrigir rsrs.
Na maioria das vezes usar o próprio n não terá nenhum problema uma vez que é apenas uma posição fora do vetor, mas... lembra da lei de Murphy? Pois é, em algum momento vai dar problema e muito provavelmente será na hora que o cliente estiver testando o programa (ou o professor) kkkkkk.
@@programeseufuturo Oi, professor! Obrigado por responder! Pois me deparei com esta questão fazendo um exercício de strings, onde eu primeiro precisava contar o numero de caracteres. Ai lembrei deste detalhe, pois deu erro na hora de alocar memória. Mas acontece né, os erros surgem no dia da apresentação hahaha. E acho que daria uma aula legal sim, embora seja uma questão mais simples, pra quem está começando é importante saber para compreender melhor o funcionamento. Mais uma vez muito obrigado e até as próximas perguntas haha abraço!
Por nada Tialisson. Abraços e até as próximas perguntas rsrs.
na hora da execução do programa, ele pulou essa linha de código. Por que?
scanf("%10[^
]", aviao.nome);
Utilizado exatamente o código desta aula, como você faria para contar o número total de caracteres da string?
Toda string termina com \0. Vc pode usar um laço que conte até encontar o '\0'
esclarecedor, tem como criar um vetor e pedir para o usuário definir no teclado quantos espaços terá o vetor?
Sim, basta fazer a leitura desse valor (tamanho do vetor) antes de criar seu vetor, assim:
int tam;
printf("Digite o tamanho do vetor: ");
scanf("%d", &tam);
char str2[tam];
@@programeseufuturo sim, mas como se faz o tamanho deste vetor apatecer no lugar de 80 aqui: scanf ("%80[^
]") porque, se o 80 não for substituido pelo tamanho lido do vetor, causará o mesmo problema tratado neste vídeo, de o scanf ler mais do que foi lido, como contornar isso?
Respondi hoje, aqui: ruclips.net/video/NTVBvicv_3k/видео.html
Bom dia eu queria fazer um treino e Fazer um programa que leia dois caracteres do teclado com a função scanf
(leitura separada), e que mostre os seus códigos ASCII correspondentes. dps queria somar os 2 valores e qual caractere resulta da soma dos dois na tabela ASCII. É uma dos treinos q está na minha agenda só q n sei como fazer, poderia me ajudar?
Olá Rickzinho. Para ler dois caracteres, um por vez, você vai precisar limpar o buffer do teclado. Você pode usar a aula 12 como exemplo: ruclips.net/video/qZOZxLwnDaA/видео.html
Sobre a tabela ASCII a aula 30 poderá te ajudar: ruclips.net/video/yOZXJKjeif4/видео.html
Qualquer dúvida pode comentar nas aulas.
Esse "[^
]" é uma regex?
no meu não deu certo :(
Aparece alguma mensagem de erro ou apenas não lê a string?
POR QUE UM PROGRAMADOR, QUE TEM O TÍTULO DE INTELIGENTE, NÃO SE TOCA E GRAVA COM LETRAS PEQUENAS E COLORIDAS, DIFICULTANDO PARA QUEM ASSISTE AO VÍDEO ATRAVÉS DE UM PEQUENO CELULAR?!
QUE ÓDIO!
SUAS AULAS PARECEM BOAS, MAS NÃO DÁ!
para de gritar man