Todo mundo sabe que C é uma linguagem de programação adorável, segura e de alto nível. No entanto, você, como codificador, define a seguinte tarefa.
Escreva um programa para adicionar dois números.
- Entrada: Dois inteiros separados por espaço.
- Saída: a soma dos dois números na entrada.
A desvantagem é que seu código deve ser 100% seguro. Em outras palavras, ele deve se comportar adequadamente, independentemente da entrada. Se a entrada é de fato dois números inteiros separados por espaço, ambos com menos de 100 dígitos, deve gerar a soma. Caso contrário, ele deve gerar uma mensagem de erro e sair com segurança.
Quão difícil pode ser afinal?
Elogios gerais serão dados aos casos de entrada patológica que quebram as respostas de outras pessoas :)
O código deve compilar sem avisos usando gcc -Wall -Wextra no ubuntu.
Esclarecimento.
- A entrada é de stdin.
- Espaço em branco horizontal é apenas um caractere de espaço único. Não deve haver nada antes do primeiro número e a entrada deve ser finalizada com nova linha + EOF ou apenas EOF.
- a única entrada válida, especificada no formulário Augus Backus-Naur , é:
NONZERODIGIT = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" POSITIVENUMBER = NONZERODIGIT * 98DIGIT NEGATIVENUMBER = "-" POSITIVENUMBER NÚMERO = NEGATIVENUMBER / POSITIVENUMBER / "0" VALIDINPUT = NÚMERO SP NÚMERO * 1LF EOF
- A mensagem de erro é a letra única 'E', seguida por uma nova linha.
- O código deve terminar de forma limpa em menos de 0,5s, independentemente da entrada.
Respostas:
6610 bytes (não compactado)
Programa "Good boy" C que atende a todos os critérios de desafio. Usa 10s complemento para números negativos. Também incluído, um equipamento de teste e casos de teste.
Aqui estão algumas ferramentas de teste e alguns casos de teste para você começar. Sinta-se livre para eliminar o uso excessivo de perl. O sistema em que foi desenvolvido não tinha uma festança moderna.
Um pequeno conjunto de casos de teste:
fonte
bc
para separar a resposta.289
EDIT : Este código funciona apenas para números inteiros positivos. As regras mudaram desde que eu postei esta resposta.
Versão não-comentada e comentada:
fonte
./tmp.c: In function ‘f’: ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c:3:1: warning: suggest parentheses around comparison in operand of ‘|’ [-Wparentheses] ./tmp.c: In function ‘main’: ./tmp.c:3:1: warning: control reaches end of non-void function [-Wreturn-type]
(s>99|c<48|c>57)
por(s>99||c<48||c>57)
corrigir isso?442
Como é bastante longo, posso jogar mais durante o fim de semana. Assume que a entrada é de stdin, terminada em EOF (sem nova linha), o separador é apenas um caractere do valor ASCII 32 (ou seja,
' '
caractere).A mensagem de erro será um único caractere 'E', seguido por uma nova linha.
Com novas linhas e um pouco de recuo adicionado: (segue uma versão legível, fique à vontade para pular aqui)
A versão legível (algumas instruções são ligeiramente alteradas para torná-las mais legíveis, mas o que elas fazem deve ser a mesma):
A
goto fail;
coisa está aqui para zombar da Apple.A versão do gcc que usei é
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
e não há avisos.fonte
getchar()
sempre é do stdin). Supõe-se que seja finalizado por EOF sem nova linha . É possível testar esta, quer por entrar em [1] [espaço] [1] [Ctrl + D] [Ctrl + D], ouecho -n '1 1' | program
633 bytes
Programa "bad boy" C que atende metade do desafio. Abusa C, lança muitos avisos, mas funciona ... mais ou menos. Aritmética de precisão arbitrária é realmente feita por
bc
.Versão não minificada
fonte