Semua orang tahu bahwa C adalah bahasa pemrograman tingkat tinggi yang indah, aman, dan tinggi. Namun Anda, sebagai pembuat kode diatur tugas berikut.
Tulis program untuk menambahkan dua angka.
- Input: Dua bilangan bulat yang dipisahkan ruang.
- Output: Jumlah dari dua angka dalam input.
Twist adalah bahwa kode Anda harus 100% aman. Dengan kata lain, itu harus berperilaku baik tidak peduli apa inputnya. Jika inputnya memang dua bilangan bulat yang dipisahkan spasi, keduanya panjangnya kurang dari 100 digit, itu harus menghasilkan jumlah. Kalau tidak, itu harus menampilkan pesan kesalahan dan berhenti dengan aman.
Betapa sulitnya itu?
Pujian umum akan diberikan pada kasus input patologis yang menghancurkan jawaban orang lain :)
Kode harus dikompilasi tanpa peringatan menggunakan gcc -Wall -Wextra di ubuntu.
Klarifikasi.
- Masukan dari stdin.
- Spasi horisontal hanyalah karakter spasi tunggal. Seharusnya tidak ada apa-apa sebelum nomor pertama dan input harus diakhiri dengan baris baru + EOF atau hanya EOF.
- satu-satunya input yang valid, yang ditentukan dalam Formulir Augmented Backus-Naur , adalah:
NONZERODIGIT = "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9" POSITIVENUMBER = NONZERODIGIT * 98DIGIT NEGATIVENUMBER = "-" POSITIVENUMBER NUMBER = NEGATIVENUMBER / POSITIVENUMBER / "0" VALIDINPUT = NUMBER SP NUMBER * 1LF EOF
- Pesan kesalahan adalah huruf tunggal 'E', diikuti oleh baris baru.
- Kode harus diakhiri dengan bersih dalam waktu kurang dari 0,5 detik, apa pun inputnya.
Jawaban:
6610 byte (tidak diperkecil)
Program "Good boy" C yang memenuhi semua kriteria tantangan. Menggunakan komplemen 10s untuk angka negatif. Juga termasuk, test harness dan test case.
Inilah sedikit test harness dan beberapa test case untuk membantu Anda memulai. Jangan ragu untuk merobek penggunaan perl yang berlebihan. Sistem yang dikembangkannya tidak memiliki bash modern.
Satu set kecil kasus uji:
sumber
bc
untuk memisahkan jawaban.289
EDIT : Kode ini hanya berfungsi untuk bilangan bulat positif. Aturan telah berubah sejak saya mengirim jawaban ini.
Versi tidak dikoleksi dan dikomentari:
sumber
./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)
dengan(s>99||c<48||c>57)
memperbaikinya?442
Ini cukup panjang, jadi saya bisa bermain golf lebih jauh selama akhir pekan. Asumsikan input dari stdin, diakhiri EOF (tanpa baris baru), separator hanya satu karakter dari nilai ASCII 32 (yaitu,
' '
karakter).Pesan kesalahan akan menjadi karakter tunggal 'E', diikuti oleh baris baru.
Dengan baris baru dan sedikit indentasi ditambahkan: (versi yang dapat dibaca mengikuti, jadi silakan lewati sini)
Versi yang dapat dibaca (beberapa pernyataan sedikit diubah agar lebih mudah dibaca, tetapi yang harus dilakukan adalah sama):
The
goto fail;
hal di sini Apple mengejek.Versi gcc yang saya gunakan adalah
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
, dan tidak ada peringatan.sumber
getchar()
selalu didapat dari stdin). Diasumsikan diakhiri EOF tanpa baris baru . Anda dapat menguji ini, baik dengan memasukkan [1] [spasi] [1] [Ctrl + D] [Ctrl + D], atauecho -n '1 1' | program
633 byte
Program "Bad boy" C yang memenuhi setengah tantangan. Pelanggaran C, melempar banyak peringatan, tetapi berhasil ... semacam. Aritmatika presisi sewenang-wenang sebenarnya dilakukan oleh
bc
.Versi tidak ditambang
sumber