Entrada de Strings com scanf
Parte da seção Logic & Flow do Journey de C da Coddy — lição 14 de 63.
Agora que você entende como as strings funcionam com o terminador nulo, é hora de aprender como obter entrada de string dos usuários. A função scanf pode ler strings usando o especificador de formato %s, mas ela vem com limitações importantes que você precisa entender.
Para ler uma string com scanf, você usa o formato %s e passa o nome do seu array de caracteres (sem o operador &, já que nomes de arrays já são endereços):
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);No entanto, scanf("%s", ...) tem uma limitação crítica: ele para de ler assim que encontra qualquer caractere de espaço em branco (espaço, tabulação ou nova linha). Isso significa que se um usuário digitar "Hello World", o scanf capturará apenas "Hello" e deixará "World" no buffer de entrada.
Outra preocupação séria é que o scanf não verifica se a entrada cabe no seu array. Se alguém inserir uma palavra maior do que o seu array pode conter, isso causará um buffer overflow, potencialmente travando seu programa ou criando vulnerabilidades de segurança. Sempre garanta que seu array de caracteres seja grande o suficiente para a entrada esperada.
Apesar dessas limitações, scanf("%s", ...) é perfeitamente adequado para ler palavras únicas, que é exatamente o que você praticará no próximo desafio.
Desafio
FácilEscreva um programa em C que demonstre a leitura de entrada de string do usuário usando scanf e a exiba de volta. Seu programa deve:
- Declarar um array de caracteres chamado
usernamecom 30 elementos para armazenar a entrada do usuário - Declarar um array de caracteres chamado
hobbycom 25 elementos para armazenar outra entrada - Usar
printfpara solicitar ao usuário a mensagem "Enter your username:" - Usar
scanfcom o especificador de formato%spara ler o nome de usuário no arrayusername - Usar
printfpara solicitar ao usuário a mensagem "Enter your hobby:" - Usar
scanfcom o especificador de formato%spara ler o hobby no arrayhobby - Imprimir ambas as strings usando
printfno formato exato mostrado abaixo
A entrada será fornecida como duas palavras únicas separadas (sem espaços dentro de cada palavra).
Sua saída deve exibir os resultados no seguinte formato:
Enter your username:
Enter your hobby:
Hello [username], your hobby is [hobby]!Por exemplo, se o usuário inserir "Alice" como o nome de usuário e "reading" como o hobby, a saída deve ser:
Enter your username:
Enter your hobby:
Hello Alice, your hobby is reading!Este desafio testa sua compreensão do uso de scanf com o especificador de formato %s para ler entrada de string, a declaração adequada de array de caracteres com tamanho suficiente e a combinação de entrada do usuário com saída formatada usando printf.
Folha de consulta
Para ler a entrada de strings dos usuários, use scanf com o especificador de formato %s:
char word[50];
printf("Enter a word: ");
scanf("%s", word);
printf("You entered: %s\n", word);Limitações importantes do scanf("%s", ...):
- Interrompe a leitura em qualquer caractere de espaço em branco (espaço, tabulação, nova linha)
- Captura apenas palavras únicas - "Hello World" torna-se apenas "Hello"
- Sem proteção contra estouro de buffer (buffer overflow) - certifique-se de que seu array seja grande o suficiente
- Não use o operador
&com nomes de arrays (eles já são endereços)
Experimente você mesmo
#include <stdio.h>
int main() {
// TODO: Declare seus arrays de caracteres aqui
// TODO: Escreva seu código aqui para solicitar e ler a entrada
// TODO: Imprima a mensagem de saída final
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato