文字列の大文字・小文字の変換

呼称: 文字列の大文字・小文字の変換
目的: 文字列を全て大文字、又は小文字へ変換する
特徴: 引数として与えた文字列を直接、書き換える
用例: 文字列の比較演算の前処理や出力のフォーマット整形等
備考: 状況に応じて void 型と char* 型を使い分ける

設定ファイルのキーの比較を行う際、全て小文字に変換して比較しようと考えました。C 言語の標準ライブラリには、文字の変換関数はあるけれど、文字列は用意されていないので自分で作る必要があります。みんなどうやって実装しているのかな?と調べてみると、見事に実装はバラバラでした(- -#

私が調べた限りでは、以下の2通りの実装がコード量も少なくて良いかなと思います。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void str2lower(char *s) {
    while(*s) {
        *s = (char)tolower((int)*s);
        s++;
    }
}

void str2upper(char *s) {
    while(*s) {
        *s = (char)toupper((int)*s);
        s++;
    }
}

char *str2lower2(char *s) {
    char *p;
    for(p=s; *p; p++) {
        *p = (char)tolower((int)*p);
    }
    return s;
}

char *str2upper2(char *s) {
    char *p;
    for(p=s; *p; p++) {
        *p = (char)toupper((int)*p);
    }
    return s;
}

int main (void) {

    char s1[] = "capitalize";
    char *s2 = "UNCAPITALIZE";
    char *buf1, *buf2;

    buf1 = strdup(s1);
    buf2 = strdup(s2);

    printf("### void function\n");
    str2upper(buf1);
    str2lower(buf2);
    printf("%s\n", buf1);
    printf("%s\n", buf2);

    printf("### char* function\n");
    printf("%s\n", str2upper2(buf1));
    printf("%s\n", str2lower2(buf2));

    free(buf1);
    free(buf2);
    return EXIT_SUCCESS;
}

実行結果。

### void function
CAPITALIZE
uncapitalize
### char* function
CAPITALIZE
uncapitalize

リファレンス:
C言語 文字判定 大文字 小文字変換