Técnicas de Entrada Segura
Visão Geral da Entrada Segura de Ponto Flutuante
Técnicas de entrada segura são cruciais para prevenir erros e garantir uma programação C robusta ao lidar com números de ponto flutuante.
Estratégias de Validação de Entrada
1. Usando a Função strtof()
#include <stdlib.h>
#include <stdio.h>
float entrada_float_segura() {
char entrada[100];
char *endptr;
float valor;
while (1) {
printf("Digite um valor float: ");
if (fgets(entrada, sizeof(entrada), stdin) == NULL) {
continue;
}
valor = strtof(entrada, &endptr);
// Verificar erros de conversão
if (endptr == entrada) {
printf("Entrada inválida. Tente novamente.\n");
continue;
}
// Verificar caracteres extras
while (*endptr != '\0') {
if (*endptr != ' ' && *endptr != '\n') {
printf("Entrada inválida. Caracteres extras detectados.\n");
break;
}
endptr++;
}
return valor;
}
}
2. Fluxo de Trabalho de Validação de Entrada
graph TD
A[Entrada do Usuário] --> B{Validar Entrada}
B --> |Válida| C[Converter para Float]
B --> |Inválida| D[Solicitar Repetição]
C --> E[Processar Valor]
Técnicas Abrangentes de Tratamento de Entrada
Métodos de Validação de Entrada
| Técnica |
Descrição |
Vantagens |
| strtof() |
Conversão robusta |
Lidar com verificação de erros |
| fgets() |
Leitura segura de linha |
Previne transbordamento de buffer |
| Verificação de Erros |
Validar conversão |
Previne comportamento inesperado |
Sanitização Avançada de Entrada
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int eh_float_valido(const char *str) {
int contador_ponto = 0;
// Verificar cada caractere
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == '.') {
contador_ponto++;
if (contador_ponto > 1) return 0;
} else if (!isdigit(str[i]) && str[i] != '-') {
return 0;
}
}
return 1;
}
float entrada_float_robusta() {
char entrada[100];
float valor;
while (1) {
printf("Digite um valor float: ");
if (fgets(entrada, sizeof(entrada), stdin) == NULL) {
continue;
}
// Remover a quebra de linha
entrada[strcspn(entrada, "\n")] = 0;
// Validar a entrada
if (!eh_float_valido(entrada)) {
printf("Formato de entrada inválido.\n");
continue;
}
// Converter para float
valor = atof(entrada);
return valor;
}
}
Boas Práticas de Tratamento de Erros
- Use funções de conversão robustas.
- Implemente validação abrangente de entrada.
- Forneça mensagens de erro claras.
- Permita que o usuário tente a entrada novamente.
Considerações de Desempenho
graph LR
A[Método de Entrada] --> B{Desempenho}
B --> |Rápido| C[strtof()]
B --> |Flexível| D[Validação Personalizada]
B --> |Simples| E[atof()]
Memória e Segurança
No LabEx, enfatizamos a importância de:
- Prevenir transbordamentos de buffer.
- Lidar com potenciais erros de conversão.
- Fornecer mecanismos de entrada amigáveis ao usuário.
Exemplo Prático
int main() {
float resultado = entrada_float_segura();
printf("Valor processado: %.2f\n", resultado);
return 0;
}