回答編集履歴
1
妙に盛り上がってしまったので、表現をぼかします
    
        answer	
    CHANGED
    
    | @@ -14,4 +14,4 @@ | |
| 14 14 | 
             
            なお、`*str != NULL`と記述するとプログラムは「動いてしまう」でしょう。Cは型の違いに鷹揚なのでNULL(void*型の0)を'\0'整数値の0に勝手に変換して比較を行ってしまいますから(警告ぐらいは出るかも)。動きはしますがしかし「意味」としては異常なことをやっているわけで、やってはいけません。
         | 
| 15 15 |  | 
| 16 16 | 
             
            もう一ついうと、Cでは言語として文字コードを規定していません。そして、'A'~'Z'あるいは'a'~'z'の文字コードが連続していることは保証しません('0'~'9'が連続していることは規定されています)。
         | 
| 17 | 
            -
            質問のプログラムは、'A'~'Z', 'a'~'z'が連続していて、'A'と'a'のオフセットが0x20であるという(C言語には決められていない)前提を要求していることは意識しましょう(asciiコード)。現在の世の中のコンピュータの | 
| 17 | 
            +
            質問のプログラムは、'A'~'Z', 'a'~'z'が連続していて、'A'と'a'のオフセットが0x20であるという(C言語には決められていない)前提を要求していることは意識しましょう(asciiコード)。現在の世の中のコンピュータの多くはその要求を満たしているとは思いますが、全てではありませんので。
         | 
