From 990ad145ea2f1013dbe6aefa0533b9700c331b60 Mon Sep 17 00:00:00 2001 From: zlg Date: Mon, 15 Jul 2013 06:38:40 -0500 Subject: Solve Exercise 4-12: Recursive itoa() --- ch4/4-12_recursive-itoa.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 ch4/4-12_recursive-itoa.c (limited to 'ch4') diff --git a/ch4/4-12_recursive-itoa.c b/ch4/4-12_recursive-itoa.c new file mode 100644 index 0000000..f2ebdcf --- /dev/null +++ b/ch4/4-12_recursive-itoa.c @@ -0,0 +1,72 @@ +#include +#include + +/* The C Programming Language: 2nd Edition + * + * Exercise 4-12: Adapt the ideas of printd() to write a recursive version of + * itoa; that is, convert an integer into a string by calling a recursive + * routine. + * + * Answer: Making itoa() recursive isn't too much work; it helps knowing how to + * use static variables; they make it possible to increment the position in the + * string without using an external variable. Additionally, you'll need to + * understand flow control to prevent the sub-routines from executing further + * than needed. As a result, itoa() gets called multiple times, but if it + * calls itself, it immediately returns so it won't venture further. This is + * to make sure i is reset to zero only after the number is finished, so the + * next call starts at the beginning of the string. + * + * Normally, recursive functions shouldn't worry about state, but it's necessary + * in this version of itoa. + */ + +void itoa(int, char[]); +void reverse(char[]); + +int main(void) { + char foo[40] = ""; + + itoa(829048, foo); + printf("%s\n", foo); + itoa(-4021, foo); + printf("%s\n", foo); + + return 0; +} + +void itoa(int num, char target[]) { + static int i = 0; + static int neg = 0; + + if (num < 0) { + neg = 1; + num = -num; + } + + if (num /= 10 > 0) { + target[i++] = (num % 10) + '0'; + num /= 10; + itoa(num, target); + return; + } else { + if (neg == 1) { + neg = 0; + target[i++] = '-'; + target[i] = '\0'; + } else { + target[i] = '\0'; + } + reverse(target); + } + i = 0; +} + +void reverse(char s[]) { + int c, i, j; + + for (i = 0, j = strlen(s)-1; i < j; i++, j--) { + c = s[i]; + s[i] = s[j]; + s[j] = c; + } +} -- cgit v1.2.3-54-g00ecf dc122667d79a3ba4905b89d99ba62&follow=1'>root/.gitignore (unfollow)
AgeCommit message (Expand)AuthorFilesLines
2019-04-29setup.py: Remove obsolete informationzlg1-1/+0
2019-01-03vgstash: Add "notes" filter to schemazlg1-1/+2
2018-11-21Prepare for distributionzlg2-1/+3
2018-10-22vgstash: let backlog filter ignore unbeatable gameszlg1-1/+1
2018-10-18Bump to 0.3beta2 for PyPIzlg1-3/+3
2018-10-18vgstash.DB.__init__: fix error output formattingzlg1-1/+1
2018-10-18README: fix inline <code> formattingzlg1-3/+4
2018-10-18cli: show msg if game to be deleted is not in DBzlg2-2/+12
2018-10-18README: expand on usage, cover shell quotingzlg1-7/+99
2018-10-18cli: Tell the user when a game lacks noteszlg2-3/+15
2018-10-18Catch when an invalid list filter is passedzlg4-3/+24
2018-10-12cli: Add zero-game import/export messageszlg2-11/+18
2018-10-10Bump to 0.3beta1 for PyPIzlg1-1/+1
2018-10-10Move tests and data to dedicated directoryzlg7-10/+26
2018-10-10cli: Add "export" commandzlg2-5/+54
2018-10-10cli: Add "import" commandzlg5-1/+76
2018-10-09Bump to 0.3alpha6 for PyPIzlg1-1/+1
2018-10-09cli: Add "notes" commandzlg2-4/+74
2018-10-09update_game: ensure notes are also savedzlg1-2/+2
2018-10-09cli: add 'update' commandzlg3-20/+92
2018-10-06cli: Add "delete" commandzlg2-0/+19
2018-10-06Remove ID field from DBzlg3-38/+46
2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40
2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1
2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107
2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1
2018-09-08cli: add '--raw' option to list commandzlg2-9/+45
2018-09-08Add remaining filters to vgstash packagezlg1-2/+11
2018-09-04Update LICENSE to match setup.pyzlg1-80/+67
2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779
2018-03-18Flesh out filter types and ownership statuszlg3-82/+144
2018-03-18README.mdown: break line correctlyzlg1-1/+1
2018-03-18add 'playlog' list filterzlg2-2/+9
2018-03-13Update helpers a bitzlg1-2/+9
2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20
2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0
2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4
2016-11-13DerpZe Libertine Gamer1-0/+1
2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23
2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4
2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1
2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101
2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9
2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5