Tratamento de Erros
Compreendendo a Gestão de Erros de Entrada
O tratamento robusto de erros é crucial para a criação de programas C confiáveis. Nas plataformas LabEx, a implementação de estratégias abrangentes de tratamento de erros garante interações suaves com o utilizador e previne terminações inesperadas do programa.
Tipos Comuns de Erros de Entrada
| Tipo de Erro |
Descrição |
Consequências Potenciais |
| Estouro de Buffer |
Exceder o tamanho do buffer alocado |
Corrupção de memória |
| Entrada Inválida |
Tipo de entrada não correspondente |
Falha do programa |
| Tratamento de EOF |
Fim inesperado da entrada |
Comportamento indefinido |
| Conversão de Tipo |
Conversão numérica incorrecta |
Erros lógicos |
Estratégias de Tratamento de Erros
1. Técnica de Validação de Entrada
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
int safe_integer_input() {
char buffer[100];
char *endptr;
long value;
while (1) {
printf("Introduza um inteiro: ");
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
printf("Ocorreu um erro na entrada.\n");
return -1;
}
errno = 0;
value = strtol(buffer, &endptr, 10);
// Verificar erros de conversão
if (endptr == buffer) {
printf("Nenhuma entrada válida detectada.\n");
continue;
}
// Verificar estouro
if ((value == LONG_MAX || value == LONG_MIN) && errno == ERANGE) {
printf("Número fora do intervalo.\n");
continue;
}
// Verificar caracteres extras
if (*endptr != '\n' && *endptr != '\0') {
printf("Entrada inválida. Caracteres extras detectados.\n");
continue;
}
return (int)value;
}
}
int main() {
int result = safe_integer_input();
if (result != -1) {
printf("Entrada válida: %d\n", result);
}
return 0;
}
Fluxo de Tratamento de Erros
graph TD
A[Entrada do Utilizador] --> B{Validar Entrada}
B --> |Válido| C[Processar Entrada]
B --> |Inválido| D[Exibir Mensagem de Erro]
D --> E[Solicitar Repetição]
E --> A
2. Abordagem Abrangente de Tratamento de Erros
#include <stdio.h>
#include <string.h>
enum InputError {
INPUT_SUCCESS,
INPUT_EMPTY,
INPUT_TOO_LONG,
INPUT_INVALID
};
enum InputError read_safe_string(char *buffer, size_t buffer_size) {
// Limpar o buffer
memset(buffer, 0, buffer_size);
// Ler a entrada
if (fgets(buffer, buffer_size, stdin) == NULL) {
return INPUT_EMPTY;
}
// Remover a nova linha
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n') {
buffer[len-1] = '\0';
len--;
}
// Verificar o comprimento da entrada
if (len == 0) {
return INPUT_EMPTY;
}
if (len >= buffer_size - 1) {
return INPUT_TOO_LONG;
}
return INPUT_SUCCESS;
}
int main() {
char input[50];
enum InputError result;
while (1) {
printf("Introduza uma cadeia de caracteres: ");
result = read_safe_string(input, sizeof(input));
switch (result) {
case INPUT_SUCCESS:
printf("Entrada válida: %s\n", input);
return 0;
case INPUT_EMPTY:
printf("Erro: Entrada vazia\n");
break;
case INPUT_TOO_LONG:
printf("Erro: Entrada demasiado longa\n");
break;
default:
printf("Erro desconhecido\n");
}
}
}
Princípios Chave de Tratamento de Erros
- Sempre valide a entrada antes de processá-la
- Utilize códigos de erro apropriados
- Forneça mensagens de erro claras
- Implemente mecanismos de repetição
- Lidar com casos limite
- Utilize funções de conversão seguras
Implementando estas técnicas de tratamento de erros, os desenvolvedores podem criar programas C mais robustos e confiáveis que lidam graciosamente com os desafios de entrada do utilizador.