Whilst reading through K&R, I came across the integer to string function. I gave it a quick read, and decided to implement it myself, but instead of printing, it updates a character array.
Here is what I have
void inttostr(int number, char str[]) {
static int i;
if (number / 10) {
inttostr(number / 10, str);
}
str[i++] = number % 10 + '0';
}
It seemed to work for the few integers I gave it, but I have some questions.
- I haven’t explicitly included the nul byte
\0at the end, so why does the string work fine when printed withprintf("%s\n", str);? - I don’t think I’m very good at thinking recursively. When I try and step through the program in my mind, I lose track of what is still awaiting execution. Is there a better way of seeing what is happening internally, to help me learn?
- Any other suggestions on the code?
I’m using Xcode.
This is not homework. I’m just learning.
Thanks!
You’re correct that you’re never writing NUL, which is a bug.
In general, you don’t have to think through the entire solution. You just have to make sure every step is correct. So in this case, you say:
1 .
inttostr(number / 10, str);will take care of all but the last digit.
2 . Then I will take care of the last one.
You can trace what’s happening, though. For e.g. 54321 it looks like:
Note that when you don’t return from any of the functions until you write the first character, then you return in the opposite order from the calls.
The … signifies that you haven’t NUL-terminated. Another issue is that you’re using a static variable, so your code isn’t reentrant; this means it breaks in certain scenarios, including multi-threading.
To address the reentrancy and NUL issue, you can do something like the code below. This creates a helper function, and passes the current index to write.
EDIT: Fixed non-static solution.