Going back to your operator[], you fixed the wrong thing. I'm guessing you tried it and an exception was thrown? You have to try to understand why that happens. When I said it was obvious, I didn't mean it would necessarily be obvious when you first look at it (otherwise you wouldn't have coded it that way), I just meant that once you realized what it was it would make sense. It sounds like you still don't know what the flaw was.
So your fix was to return sink instead of throwing an exception in the first if statement. That wasn't where the problem was. The problem was the if. Pick a number and run it through the if and see where you get. You should always do this in your mind or on paper to test the if to see if it does what you want. Let's say the stringlength is 8 and the user wants the character at position 3. Follow your if in the earlier code and see what gets executed.
>> isn't printf used in C++?
It can be, but cout is generally used instead.