C/C++ ポインタ入門 > 文字列関数 > toupper
Nobuhide Tsuda
Nov-2013
大文字変換:void my_toupper(char *str)
void my_toupper(char *str)
{
while( *str != '\0' ) { // 終端のヌル文字を見つけるまで繰り返し
if( *str >= 'a' && *str <= 'z' ) // 英小文字の場合
*str += 'A' - 'a'; // 大文字変換
++str;
}
}
解説:
- while 文で、終端記号のヌル文字('\0')を見つけるまでループします。
- ポインタの指す文字が英小文字('a'~'z')だった場合は大文字('A'~'Z')に変換します
- 英字の文字コードは a から z まで連続なので、大小文字 a のコード差を足すだけで、変換できます。
void my_toupper(char *str)
{
char ch;
while( (ch = *str++) != '\0' ) { // 終端のヌル文字を見つけるまで繰り返し
if( ch >= 'a' && ch <= 'z' ) // 英小文字の場合
*(str - 1) = ch + 'A' - 'a'; // 大文字変換
}
}
解説:
- この版は、ポインタが指す文字を何度も参照せず、char ch に代入して判定・処理を行っています。
- ずっと昔は、レジスタに比べて低速なメモリ参照が何度も発生せず、こちらのコードの方が高速でした。
- が、今どきの最適化コンパイラであれば、どちらも同じようなコードを生成するはずです。
- 分かりやすいと思う方の書き方を採用すればいいと思います。
前:
| 次: