Manipulação Prática de Entrada
Fluxo de Processamento de Entrada
graph TD
A[Entrada do Usuário] --> B{Validar Entrada}
B -->|Válida| C[Processar Entrada]
B -->|Inválida| D[Tratamento de Erros]
C --> E[Armazenar/Transformar Dados]
D --> F[Solicitar Repetição]
Cenários Comuns de Entrada
1. Manipulação de Entrada de Texto
#define MAX_INPUT 100
char buffer[MAX_INPUT];
if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
// Remover a nova linha final
buffer[strcspn(buffer, "\n")] = 0;
// Processar a entrada
printf("Você digitou: %s\n", buffer);
}
2. Validação de Entrada Numérica
int parse_integer(const char *input) {
char *endptr;
long value = strtol(input, &endptr, 10);
// Verificar erros de conversão
if (endptr == input) {
fprintf(stderr, "Nenhum número válido encontrado\n");
return -1;
}
// Verificar estouro
if (value > INT_MAX || value < INT_MIN) {
fprintf(stderr, "Número fora do intervalo\n");
return -1;
}
return (int)value;
}
Técnicas de Análise de Entrada
| Técnica |
Caso de Uso |
Prós |
Contras |
| fgets() |
Entrada segura de texto |
Seguro |
Flexibilidade limitada |
| getline() |
Entrada dinâmica de texto |
Flexível |
Sobrecarga |
| sscanf() |
Análise de entrada formatada |
Versátil |
Análise complexa |
| strtok() |
Análise baseada em tokens |
Útil para entrada delimitada |
Modifica a string original |
Manipulação Avançada de Entrada
typedef struct {
char name[50];
int age;
float salary;
} Employee;
int read_employee_data(Employee *emp) {
printf("Digite nome, idade e salário: ");
if (scanf("%49s %d %f",
emp->name,
&emp->age,
&emp->salary) != 3) {
fprintf(stderr, "Formato de entrada inválido\n");
return 0;
}
// Validação adicional
if (emp->age < 0 || emp->salary < 0) {
fprintf(stderr, "Idade ou salário inválido\n");
return 0;
}
return 1;
}
Estratégias de Tratamento de Erros
graph TD
A[Entrada Recebida] --> B{Verificação de Validação}
B -->|Sucesso| C[Processar Dados]
B -->|Falha| D{Tipo de Erro}
D -->|Erro de Formato| E[Solicitar Repetição]
D -->|Erro de Intervalo| F[Fornecer Orientação]
E --> A
F --> A
Limpeza de Buffer de Entrada
void clear_input_buffer() {
int c;
while ((c = getchar()) != '\n' && c != EOF) {
// Descartar caracteres restantes
}
}
Dicas de Otimização de Desempenho
- Minimizar alocações de memória
- Usar buffers baseados na pilha sempre que possível
- Implementar algoritmos de análise eficientes
Abordagem de Aprendizagem LabEx
O LabEx recomenda a prática dessas técnicas por meio de exercícios interativos de codificação para desenvolver habilidades robustas de manipulação de entrada.
Exemplo Completo de Manipulação de Entrada
#define MAX_TENTATIVAS 3
int main() {
char input[100];
int tentativas = 0;
while (tentativas < MAX_TENTATIVAS) {
printf("Digite um número válido: ");
if (fgets(input, sizeof(input), stdin) == NULL) {
break;
}
int result = parse_integer(input);
if (result != -1) {
printf("Entrada válida: %d\n", result);
return 0;
}
tentativas++;
}
fprintf(stderr, "Número máximo de tentativas atingido\n");
return 1;
}
Principais Pontos
- Valide todas as entradas do usuário
- Implemente tratamento robusto de erros
- Utilize técnicas apropriadas de análise de entrada
- Considere sempre as possíveis variações de entrada