Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で文字列内の各単語の先頭文字を大文字に変換するプログラム

大文字と小文字が混在する文字列が与えられたとき、各単語の最初の文字を大文字にし、それ以外の文字はすべて小文字に揃えるのがこの記事のテーマです。

まずは簡単な例で内容を確認してみましょう。

たとえば「hElLo world」という文字列が与えられた場合、先頭の小文字「h」を大文字「H」に変換し、スペースから文字列の末尾までの残りの文字はすべて小文字にします。同様に、スペースの直後に現れる文字についても、必ず大文字へ変換する必要があります。

入出力例

Input: str[] = {"heLlO wORLD"}
Output: Hello World

Input: str[] = {"sUNIDHi bAnSAL"}
Output: Sunidhi Bansal

アプローチ:ASCII値を活用する

  • この問題は、各文字に割り当てられたASCII値を利用することで解決できます。
  • ASCII(American Standard Code for Information Interchange)とは、すべての文字に固有のコード番号を対応させた規格です。英大文字 A〜Z には 65〜90、英小文字 a〜z には 97〜122 の数値が割り当てられています。
  • 大文字と小文字のASCII値の差は常に一定(32)であるため、この差分を加減算するだけで大小文字を相互に変換できます。
  • 文字列全体を先頭から順に走査しながら、以下の条件で判定を行います。
  • その文字が文字列の先頭、またはスペースの直後の文字であり、かつ a〜z の範囲(小文字)にある場合は、「'A' − 'a'」の差分を加算して大文字に変換します。
  • それ以外の位置にある文字が A〜Z の範囲(大文字)であれば、「'a' − 'A'」の差分を加算して小文字に変換します。

アルゴリズム

Start
In Function int firstupper(char str[], int n)
    Step 1-> Initialize int i
    Step 2-> Loop For i = 0 And i<n And i++
        If i == 0 && str[i] != ' ' || str[i] != ' ' && str[i-1] == ' ' then,
            If str[i] >= 'a' && str[i]<='z' then,
                str[i] = (char)(('A'-'a') + str[i])
            End If
        Else If str[i] >= 'A' && str[i] <= 'Z' then,
            str[i] = (char)(str[i] + ('a' - 'A'))
        End If
End Function
In Function int main(int argc, char const *argv[])
    Step 1-> Declare and initialize char str[] = {"sUNIDHi bAnSAL"}
    Step 2-> Declare n set as sizeof(str)/sizeof(str[0])
    Step 3-> firstupper(str, n)
    Step 4-> Print "%s\n", str
End main

C言語による実装例

#include <stdio.h>

int firstupper(char str[], int n) {
    int i;
    for(i = 0; i < n; i++) {
        /* 先頭の文字、またはスペースの直後の文字の場合 */
        if ((i == 0 && str[i] != ' ') || (str[i] != ' ' && str[i-1] == ' ')) {
            if(str[i] >= 'a' && str[i] <= 'z') {
                str[i] = (char)(('A' - 'a') + str[i]);  /* 小文字 → 大文字 */
            }
        }
        /* 上記以外の位置にある大文字は小文字へ変換 */
        else if (str[i] >= 'A' && str[i] <= 'Z') {
            str[i] = (char)(str[i] + ('a' - 'A'));  /* 大文字 → 小文字 */
        }
    }
    return 0;
}

int main(int argc, char const *argv[]) {
    char str[] = {"sUNIDHi bAnSAL"};
    int n = sizeof(str) / sizeof(str[0]);
    firstupper(str, n);
    printf("%s\n", str);
    return 0;
}

実行結果

Sunidhi Bansal

補足:標準ライブラリ関数を使う方法

実際の開発では、<ctype.h> ヘッダーに用意されている toupper()tolower() を使えば、ASCII値を意識することなく同じ処理をより簡潔に記述できます。ただし、文字コードの内部構造を理解するうえで、ASCII値を直接操作する上記の手法は非常に良い学習材料になります。


  1. C#で文字列の大文字・小文字を変換する方法(ToLower/ToUpperメソッド)

    C#では、ToLower()メソッドとToUpper()メソッドを使うことで、文字列の大文字と小文字を簡単に変換できます。この記事では、具体的なコード例とともに、それぞれの使い方をわかりやすく解説します。 大文字から小文字へ変換する(ToLowerメソッド) たとえば、次のような大文字のみの文字列があるとします。 str = AMIT; この大文字の文字列を小文字に変換するには、ToLower()メソッドを使用します。 Console.WriteLine(Converted to LowerCase : {0}, str.ToLower()); サンプルコード 以下は、C#で文字列の大文字を小

  2. 整数を文字列に変換するC#プログラムの書き方

    C#で整数(int型)を文字列(string型)に変換するには、ToString()メソッドを使用します。このメソッドは、すべての数値型が持つ標準的なメソッドで、呼び出すだけで簡単に文字列表現を取得できます。基本的な変換手順1. 変換したい整数を用意するまず、文字列に変換したい整数値を変数に格納します。int num = 299;2. ToString()メソッドで変換する次に、ToString()メソッドを呼び出して、整数を文字列に変換します。String s; int num = 299; s = num.ToString();完全なサンプルコード以下のコードを実行すると、整数を文字列に変