"S" pronounced as /s/ or /z/
Some additional guidelines beyond Hunter's:
Based on the immediately surrounding letters:
Word-internal -ns- (including -nse, with "silent e" after the s), is almost always pronounced /ns/ with unvoiced /s/ (e.g. in insist, tense, tinsel). This is different from the pattern for word-final -ns, which is usually pronounced /nz/ (as in pens or lens).
- cleanse ends in /nz/
Some words spelled with -nsy are pronounced with /nzi/, such as pansy, quinsy, tansy. The word teensy seems to be variable: I'm an American, and I've only heard it pronounced with /nsi/, but the OED and Collins indicate that it is pronounced with /nzi/ in British English.
It might make sense to compare these to words ending in /mzi/ and spelled with -msy, such as clumsy, flimsy, whimsy.
For some speakers, certain (but not necessarily all) words starting with trans- such as transit and transition have /nz/.
The place-name Kansas is pronounced with /nz/
Word-internal -ls-, e.g. in else, pulse, repulsive is almost always pronounced /ls/ with unvoiced /s/. This is different from the pattern for word-final -ls, which is usually pronounced /lz/ (as in eels or steals). Exception: palsy, which has /lz/.
Word-internal -rs-, e.g. in persist, verse, is almost always pronounced /rs/* with unvoiced /s/. (Or in a non-rhotic accent, there is no /r/.) This is different from the pattern for word-final -rs, which is usually pronounced /rz/ (as in stars or yours).
* Speakers of non-rhotic accents would not pronounce a consonant /r/ in these contexts, but would just use a different value for the preceding vowel, e.g. /vɜːs/, /stɑːz/.
Based on identifying particular suffixes:
The ending -sive is usually pronounced /sɪv/ with voiceless /s/, even when there is a vowel letter immediately preceding the letter "s". For example, explosive, invasive, abusive, derisive are all pronounced with /s/. There is at least one known possible exception, but it is optional: divisive (there is also some variation in the pronunciation of the stressed vowel in this word: see the ELU question Differing pronunciations of “divisive”).
The ending -osity is always pronounced with voiceless /s/.
"S" as /z/ after one-syllable prefixes ending in fully unstressed vowels
If you include unstressed re-, de-, and pre- as prefixes, then hunter's first rule isn't entirely correct. It is usual for "s" to be pronounced as /z/ when it comes before a vowel and after a fully unstressed version of one of these prefixes. Examples: /z/ is used in resolve, resound, resign, reserve, resume, result, resist, resent; deserve, design, desire, desert; preserve, present, presume, preside.
When these prefixes have any stress (and in newly-formed words, they do tend to have at least secondary stress) then a following "s" is pronounced as voiceless /s/. Examples: /s/ is used in resale, reset, reseat, reseal, resupply, resell; desalt; preset, presell, presoak.
"S" pronounced as a postalveolar consonant
Also, when "s" comes before a letter like "i", "u" or "e", it may represent a postalveolar consonant like /ʃ/ or /ʒ/ because of historical palatalization. Usually, the rules for /ʃ/ vs. /ʒ/ parallel the rules for /s/ vs. /z/, but in a few cases they differ. For example, words spelled with -rsion are usually pronounced with a postalveolar fricative, and in American English they are often pronounced with voiced /ʒ/ in contradiction to the general rule for "rs". (E.g. "immerse" and "immersive" have /rs/, but "immersion" has /rʒ/ for me; I also have /rʒ/ in "Persia(n)". But for some reason, only /rʃ/ is possible for me in "torsion".)
Note that variability between /ʃ/ or /ʒ/ in words spelled with the letter "s" (and sometimes "ss") is fairly common in other contexts too, not just after /r/: e.g. "fission" and "Asia". Usually, the /ʒ/ variant is more common in American English, and the /ʃ/ variant is more common in British English.
I can't think of any word where "c" is pronounced /z/ in a modern accent, but "ti" is usually pronounced /ʒ/ in the word "equation".