【C言語】
大文字小文字判定関数の使い方

警告:isupper()の戻り値は true/falseじゃない

1は非ゼロだが非ゼロが1とは限らない。


if(isupper() == true)は間違い

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

int main(void){
    char    buf[] = "abcd123EFG456hijk789";            
    printf("変換前 %s\n",buf);    
    for(char *cp = buf;*cp != '\0';cp++){
        if(isupper(*cp) == true){
            *cp = tolower(*cp);
            continue;
        } 
        if(islower(*cp) == true){
            *cp = toupper(*cp);
            continue;
        }
    }    
    printf("変換後 %s\n",buf);
}

isupperは
ゼロか非ゼロを返しますが、
非ゼロが1とは限りません。

なのでこのプログラムは期待した
大文字小文字変換を行いません。


falseと比較すると動く(非推奨)

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

int main(void){
    char    buf[] = "abcd123EFG456hijk789";            
    printf("変換前 %s\n",buf);    
    for(char *cp = buf;*cp != '\0';cp++){
        if(isupper(*cp) != false){
            *cp = tolower(*cp);
            continue;
        } 
        if(islower(*cp) != false){
            *cp = toupper(*cp);
            continue;
        }
    }    
    printf("変換後 %s\n",buf);
}

このプログラムは期待した
大文字小文字変換を行います。

しかし、
if(isupper(*cp) != false)を
日本語で読み上げると
「もし*cpが大文字であるならばが偽でなければ」のようになり読みにくいです。


明示的な検査をしない(推奨)

#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>

int main(void){
    char    buf[] = "abcd123EFG456hijk789";            
    printf("変換前 %s\n",buf);    
    for(char *cp = buf;*cp != '\0';cp++){
        if(isupper(*cp)){
            *cp = tolower(*cp);
            continue;
        } 
        if(islower(*cp)){
            *cp = toupper(*cp);
            continue;
        }
    }    
    printf("変換後 %s\n",buf);
}

このプログラムは期待した
大文字小文字変換を行います。

if(isupper(*cp) )を
日本語で読み上げると
「もし*cpが大文字ならば」のようになり
読みやすいです。


参考:

EXP20-C. 成功、真偽、等価を判定するには明示的な検査を行う

C-FAQ9.2一般にTRUEやFALSEを相手に明示的にテストするこ とは望ましくない。

■アンケート

1
もしxが大文字ならば?をどう書きますか?