C言語で文字列内の大文字と小文字を反転(トグル変換)させるプログラムの書き方
はじめに
大文字を小文字へ、小文字を大文字へと変換する処理は、一般的に「トグル(toggle)」と呼ばれます。
各文字をトグルするとは、与えられた文字列の中で、小文字を大文字の形に、大文字を小文字の形にそれぞれ変換することを意味します。たとえば「TutoRial」であれば「tUTOrIAL」となります。
プログラム1:ASCIIコードの差分を使う方法
以下は、大文字を小文字に、小文字を大文字に変換するCプログラムです。ASCIIコードでは同じ英字の大文字と小文字のコード値が32だけ異なるため、この差分を利用して変換を行っています。
#include <stdio.h>
#define MAX 100
void toggle(char *string);
int main(){
char string[MAX];
printf("enter the string need to be toggle :\n");
gets(string);
toggle(string);
printf("final string after toggling is:\n");
printf("%s\n", string);
return 0;
}
void toggle(char *string){
int i = 0;
while(string[i] != '\0'){
if(string[i] >= 'a' && string[i] <= 'z'){
string[i] = string[i] - 32;
}
else if(string[i] >= 'A' && string[i] <= 'Z'){
string[i] = string[i] + 32;
}
i++;
}
}このプログラムのポイントは次のとおりです。
- 小文字('a'〜'z')から32を引くと、対応する大文字に変換されます。
- 大文字('A'〜'Z')に32を加えると、対応する小文字に変換されます。
- 数字や空白、記号など英字以外の文字はそのまま維持されます。
- 文字列の終端を示すヌル文字('\0')に到達するまで、while文で1文字ずつ処理を繰り返します。
なお、サンプルコードで使用しているgets関数はバッファオーバーフローを引き起こす危険があるため非推奨とされています。実際の開発では、fgets関数などの安全な代替手段を使うことが推奨されます。
プログラム1の実行結果
上記のプログラムを実行すると、次のような出力が得られます。
enter the string need to be toggle : TutoRialS PoinT C ProgrAmmIng LanGuage final string after toggling is: tUTOrIALs pOINt c pROGRaMMiNG lANgUAGE
プログラム2:標準ライブラリ関数を使う方法
C言語の標準ヘッダー<ctype.h>には、isupper(大文字判定)、islower(小文字判定)、toupper(大文字へ変換)、tolower(小文字へ変換)といった便利な文字操作関数が用意されています。これらを利用すると、より簡潔で可読性の高いコードになります。
#include <stdio.h>
#include <ctype.h>
int main(){
int i, length = 0;
char string[] = "TutORial";
length = sizeof(string)/sizeof(string[0]);
for(i = 0; i < length; i++){
if(isupper(string[i])){
string[i] = tolower(string[i]);
}
else if(islower(string[i])){
string[i] = toupper(string[i]);
}
}
printf("final string after conversion: %s", string);
return 0;
}ここではsizeof演算子を使って配列全体のサイズを要素1個分のサイズで割ることで、文字列の長さを求めています。あとはfor文で各文字を走査し、大文字なら小文字へ、小文字なら大文字へと変換しています。元のコードでは<ctype.h>のインクルードが不足しているため、コンパイル時には追加が必要です(上記のコードでは修正済みです)。
プログラム2の実行結果
実行結果は次のとおりです。
final string after conversion : tUTorIAL
まとめ
大文字・小文字のトグル変換は、「ASCIIコードの差分(±32)を利用する方法」と「ctype.hの標準関数を利用する方法」の2通りで実装できます。仕組みの理解や学習目的には前者が、実際の開発では安全性や可搬性の観点から後者がおすすめです。いずれの方法でも英字以外の文字はそのまま出力されるため、半角英数字の文字列を対象とした処理に有効です。
-
組み込み関数を使わずにPythonで大文字・小文字の文字数をカウントする方法
はじめに 本記事では、以下の問題に対する解決策について詳しく解説します。 問題文 文字列が与えられたとき、組み込みの文字判定関数を使用せずに、その文字列に含まれる大文字と小文字の数をそれぞれカウントする必要があります。 通常、この問題はPythonに標準で用意されている islower() や isupper() を使えば簡単に解決できます。しかし今回は「これらの文字判定関数を使わない」という制約があるため、文字のASCIIコード値を活用したアプローチを採用します。 ord() 関数を使うことで、文字列内の各文字のASCIIコード値を取得できます。取得した値が小文字の範囲(97〜122)
-
組み込み関数を使わずに大文字・小文字をカウントするPythonプログラム
この記事では、文字列に含まれる大文字と小文字の数を数える問題を、組み込みの文字判定メソッドに頼らずに解くための考え方と実装方法を解説します。 問題の概要 文字列が入力として与えられたとき、その中に含まれる大文字の数と小文字の数をそれぞれ求める必要があります。 ここでは、isupper() や islower() のような文字判定メソッドは使わず、組み込み関数 ord() を利用して各文字のASCII値を調べることで判定を行います。 ASCII値による判定の考え方 ASCIIコードでは、英字は次のような範囲に割り当てられています。 小文字(a〜z):97〜122 大文字(A〜Z):65〜90