• ベストアンサー

文字変換について

以前文字の逆順について質問させてもらったものです。 キーボードから入力した文字を逆順で表示することまではできたのですが 小文字を大文字に、大文字を小文字に変換するところで苦戦してしまいました。 とりあえず僕は、 if('a'<= c && c<='z') c=c-('a'-'A'); if('A'<=c && c<='Z') c=c+('a'+'A'); という方法で変換させようとしたのですが、 実行すると、へんな漢字が表示されてしまいました。 どのようにすればこの問題を解消できるのでしょうか? 教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

ます ASCII コードだと仮定すると、大文字と小文字の差は、'a' - 'A' です。(小文字の方が数値として大きい) なので、 小文字→大文字 c -= ('a' - 'A'); 大文字→小文字 c += ('a' - 'A'); ※こちらで、'a' + 'A' を足しているのが間違いのもと また、小文字→大文字変換が終わった後で、c は大文字になっていますから、元のままだと、すべての場合に、もう一度小文字に変換されてしまいます。 まとめると、 if ('a' <= c && c <= 'Z') c -= ('a' - 'A'); else if ('A' <= c && c <= 'Z') c += ('a' - 'A'); あたりでしょうか。 でも、問題の趣旨から外れるのでなければ、 #include <ctype.h> if (islower(c)) // 小文字なら c = toupper(c); // 大文字に変換 else if (isalpha(c)) // 小文字でなくて、アルファベットなら c = tolower(c); のほうが良いかなと思います。 ※直接、「大文字である」というのを判定する標準関数ってないのですね。

santye
質問者

お礼

回答ありがとうございます。 >※直接、「大文字である」というのを判定する標準関数ってないのですね。 たしかにそうですよね。あればこんなにややこしい判断のしかたをせずに済むのにとおもいます。

その他の回答 (2)

noname#39970
noname#39970
回答No.3

c=(c-'a')+'A'; //何番目の文字なのかを算出し大文字側へ置き換える c=c+('a'-'A'); //これはAがaより低いcharコード前提で良くない(Aがaより大きい文字コードでは失敗する) 何番目の文字であるかを算出してから変換するようにする No1のようにelseの中でifを使い先に変換が終ったcを再変換させないようにする if('a'<=c && c<='z'){  c=(c-'a')+'A'; } else {  if('A'<=c && c<='Z'){   c=(c-'A')+'a';  } }

santye
質問者

お礼

回答ありがとうございました。 たしかに else if をつかわないと、変換してまた変換されちゃいますよね。 何とかプログラム完成しました。 ありがとうございます。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.1

if('a'<= c && c<='z') { c=c-('a'-'A'); } else { if('A'<=c && c<='Z') c=c+('a'+'A'); }

関連するQ&A

専門家に質問してみよう