• ベストアンサー

大文字⇔小文字の変換

大文字⇔小文字の変換をしたいのですが、tolowerやtoupperを使わずにしたいのです。 「a」は16進数で61 「A」は16進数で41 なので20を引けば変換できると思うのですが、可能でしょうか?

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

文字コードとして ASCII を使っていることがわかっていれば, 0x20 を足したり引いたりすることで変換できます. ポータブルじゃないことを認識していれば OK なんですけど, 正直 tolower や toupper を使うべきだと思います.

その他の回答 (1)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> tolowerやtoupperを使わずにしたいのです。 なぜでしょうか? 単にtolowerやtoupperを使わないというだけであれば、towlowerやtowupperを使うという手もありますし、towctransを使ってもよいでしょう。 "C"ロケールかつASCIIであれば、isupper(c) ? (c - 'A' + 'a') : c のようなやり方もありですが、これでは移植性がありませんし、ロケールにも対応できません。

関連するQ&A

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する。 #include <ctype.h> #include <stdio.h> void name_toupper(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = toupper(istr[i]); i++; } } void name_tolower(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { ostr[i] = tolower(istr[i]); i++; } } void name_change(char istr[], char ostr[]) { unsigned i = 0; while (istr[i]) { if(isupper(istr[i])) { ostr[i] = toupper(istr[i]); } else { ostr[i] = tolower(istr[i]); } i++; } } int main(void) { char buffer[100]; printf("文字"); gets(buffer); name_toupper(buffer); printf("大文字: %s\n", buffer); name_tolower(buffer); printf("小文字: %s\n", buffer); name_change(buffer); printf("大小交換: %s\n", buffer); return 0; } 上のプログラムでは、呼び出し時のパラメータが足りないとエラーが発生してしまいます。文字列を入れておく配列をbuffer以外にもう一つ作らなくてはいけないと思うのですが、うまくいきません。 教えてください。よろしくお願いします。

  • C言語の変換する関数について教えてください。

    キーボードからローマ字で入力された名前の英文字を変換する関数を定義し、その関数の機能を確認するプログラムを作成する問題について教えてください。 (1)英小文字であればそれを英大文字に変換する関数 (2)英大文字であればそれを英小文字に変換する関数 (3)英小文字であればそれを英大文字に、英大文字であればそれを英小文字に変換する関数 ただし、キーボードから入力された名前を格納する配列と、変換後の名前を格納する配列を別にする。 また、名前は関数main()内で表示する #include <ctype.h> #include <stdio.h> void name_toupper(char str[]) { unsigned i = 0; while (str[i]) { str[i] = toupper(str[i]); i++; } } void name_tolower(char str[]) { unsigned i = 0; while (str[i]) { str[i] = tolower(str[i]); i++; } } int main(void) { char str[100]; printf("文字"); scanf("%s", str); name_toupper(str); printf("大文字: %s\n", str); name_tolower(str); printf("小文字: %s\n", str); return 0; } 自分で作った上のプログラムではKa siと入力すると(1)ではKA、(2)ではkaと表示されsiが消えてしまいます。原因がよくわかりません。 あと(3)ができないし、ただしを満たしているのかもあいまいです。 文字列の入力の形式:char *gets(char *buffer)を用いればどうにかなるのではと思っていますがどうですか? 説明が長くなって申し訳ありませんが教えてください。 よろしくお願いします。

  • 16進数変換

    文字列16進数をバイナリ16進数に変換する参考ソースが以下のようになっていたのですが、どういう意味でしょうか? strSerial ..... 文字列16進数 ForwardBuf ..... char BackBuf .....char /* 文字列16進数長を代入 */ Len_strSerial = strlen(strSerial); /* 文字列16進数を大文字に変換 */ for (iToupCnt=0; iToupCnt < Len_strSerial; iToupCnt++) { tmpbuf[iToupCnt] = toupper(strSerial[iToupCnt]); } for (iStrsCnt = 0; iStrsCnt < Len_strSerial; iStrsCnt += 2) { ForwardBuf = (tmpbuf[iStrsCnt] >= 'A' ? tmpbuf[iStrsCnt] - 'A' + 10 : tmpbuf[iStrsCnt] - '0'); BackBuf = (tmpbuf[iStrsCnt + 1] >= 'A' ? tmpbuf[iStrsCnt + 1] - 'A' + 10 : tmpbuf[iStrsCnt + 1] - '0'); binSerial[iBSLCnt] = ForwardBuf * 16 + BackBuf; iBSLCnt++; } ちょっと見にくいですね・・・すみません よろしくお願いします ちなみに最終的にはバイナリ16進数とバイナリ16進数長が 求められるようです。

  • プログラム

    文字列str内のすべての英字を大文字に変換する関数および小文字に変換する関数void str_toupper(char *str)    void str_tolower(char *str) を作成したいのですが、検討つかなくて困っています、、 表示例としては、 文字列を入力:asDFgH 大文字:ASDFGH 小文字:asdfgh

  • 大文字を小文字に変換するプログラム

    if((fp4 = fopen("sample.txt","r")) == NULL){ printf("can't open\n"); return(-1);//強制終了 } else{ while((c=fgetc(fp4))!=EOF){/*EOFまでfp4に入力*/ if(isupper(c)){ c=tolower(c); printf("%s",c); } else printf("a"); //確認用 } } ファイルから文字を読み込んでctype関数を使って大文字から小文字に変換したいんですがうまくいきません。 コンパイルしても確認用が反応しないんでおそらくどこか間違ってると思うんですがわかりません。 ご教授宜しくお願いします。

  • 文字コード変換プログラム

    こんにちは 文字コードを一発で2進数に変換してくれるプログラムを探しています。例えば A-->01000001 あ-->1000001010100000 16進数に変換してくれるプログラムって結構見つかりましたが なぜか2進数が見つかりませんでした。 (16進数を2進数に変換すれは良いのですが、できれば一発で…) プログラムを載せているサイトをご存知の方、宜しくお願いします。

  • 文字を16進変換

    C言語にて関数などを使わずに計算式なので文字を16進数に変換したいのですがどのような処理にしたらいいでしょうか?? char型で用意した変数に1文字を格納し、それをアスキーコードの16進数に変換したいです。 よろしくお願いします。

  • 大文字を小文字に、小文字を大文字にするプログラム

    問題は、 ファイルにあるアルファベットの大文字を小文字に変換し、小文字は大文字に変換して、ファイルに保存するプログラムを作りなさい というものです。 色々考えて、 #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <ctype.h> int main(int argc,char **argv){ int fd,flag1,flag2; int i,n; char buffer[512],x; fd = open(argv[1],O_RDWR); if(fd == -1) perror("open"); while((n = read(fd,buffer,sizeof(buffer)))>0){ x = buffer[i]; flag1 = islower(x); flag2 = isupper(x); for(i=0;i<n;++i) if(flag1 == 1){ buffer[i] = toupper(buffer[i]); }else if(flag2 == 1){ buffer[i] = tolower(buffer[i]); } write(fd,buffer,n); } close(fd); exit(0); } のようなプログラムを考えましたが、うまくいきません。 toupperのような関数を使ったのは初めてなのでよく使い方が分からずこのようなプログラムになってしまいました。 どうか正しく動くようなプログラムを教えてください。お願いします。

  • ファイルからの変換

    c言語初心者です。 あらかじめファイルを作っておいて その中に小文字でvffjfと入れておきます。 それを読み取り大文字に変えファイルに表示させるプログラムをつくりたいのですが、 toupperの使い方や、変換させてまた再度入力させるには どのようなものが必要ですか?

  • 文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法

    文字列を大文字の2桁ごとのコンマ付き16進数に変換する方法がわかりません。ただ単に文字列を16進数に変更するだけならbin2hex()でできますけど、誰か知っている方はいませんか?具体的には、変換された文字列が1a2b3c4d5e6fなら、1A.2B.3C.4D.5E.6Fと変換したいんです。どうすればいいですか?

    • ベストアンサー
    • PHP

専門家に質問してみよう