Index |
 |
HOME >
プログラムTOP >
C++ |
|
C++の壺・データ変換篇
C++の基本テクニックのTipsです。データ変換篇では、データを変換して出力する方法を扱います。

アルファベットの大文字と小文字は位置が決まっていますので、それぞれの文字コードの差を算出して加減すれば、大文字または小文字に変換することができます。(参考 : 基本文字コード表)
【アルファベットの文字コード】
・ 大文字 : 'A' = 65(0x41) 〜 'Z' = 90(0x5a)
・ 小文字 : 'a' = 97(0x61) 〜 'z' = 122(0x7a) (括弧内は16進の値)
// 小文字変換
#include <stdio.h> // printf使用
#include <conio.h> // getch使用
// main 関数
void main()
{
char s[10] = "AaBbCc";
int n = 'a' - 'A';
int i;
for (i=0; s[i]; i++) {
// 大文字(A-Z)なら変換
if ('A'<=s[i] && s[i]<='Z') {
s[i] = s[i] + n;
}
}
printf("%s\n", s); // "aabbcc"
if (getch()) return;
}
|
// 大文字変換
#include <stdio.h> // printf使用
#include <conio.h> // getch使用
// main 関数
void main()
{
char s[10] = "AaBbCc";
int n = 'a' - 'A';
int i;
for (i=0; s[i]; i++) {
// 小文字(a-z)なら変換
if ('a'<=s[i] && s[i]<='z') {
s[i] = s[i] - n;
}
}
printf("%s\n", s); // "AABBCC"
if (getch()) return;
}
|
また、大文字を小文字に変換する tolower関数や、小文字を大文字に変換する toupper関数を利用することもできます。ただし、これらの関数では、元の文字に変化はありません(関数を実行しても小文字または大文字のまま)ので、元の文字を変換したい時は、代入し直す必要があります。
| tolower / toupper function |
| 書式 | int tolower( int c );
| int toupper( int c ); |
| 機能 | 文字を小文字に変換 | 文字を大文字に変換 |
| 引数 | c...変換する文字 | c...変換する文字 |
| 戻り値 | 変換後の文字 | 変換後の文字 |
| 要件 | ctype.h のインクルード | ctype.h のインクルード |
/* 小文字変換 */
#include <stdio.h> // printf使用
#include <conio.h> // getch使用
#include <ctype.h> // tolower使用
// main 関数
void main()
{
char s[10] = "AaBbCc";
int i;
for (i=0; s[i]; i++) {
s[i] = tolower(s[i]); // 変換して代入
}
printf("%s\n", s); // "aabbcc"
if (getch()) return;
}
|
/* 大文字変換 */
#include <stdio.h> // printf使用
#include <conio.h> // getch使用
#include <ctype.h> // toupper使用
// main 関数
void main()
{
char s[10] = "AaBbCc";
int i;
for (i=0; s[i]; i++) {
s[i] = toupper(s[i]); // 変換して代入
}
printf("%s\n", s); // "AABBCC"
if (getch()) return;
}
|
文字列を数値に変換するには、整数値の場合は atoi、浮動小数点の場合は atof の各関数を利用します。atoi は、int型の整数に変換しますが、long型整数に変換する atol 関数もあります。仕様は atoi に準じます。
| atoi / atof function |
| 書式 | int atoi( const char *str );
| double atof( const char *str ); |
| 機能 | 文字列を int型の整数値に変換
| 文字列を double型の小数値に変換 |
| 引数 | str...変換する文字列
| str...変換する文字列 |
| 戻り値 | int型の数値(変換不可の時は 0)
| double型の数値(変換不可の時は 0.0) |
| 要件 | stdlib.h のインクルード
| stdlib.h または math.h のインクルード |
これらの関数では、文字列の先頭の半角スペースとタブは無視されます。そして最初の文字から数値に変換していき、途中に数値以外('\0' も含む)の文字を検知したところで変換を中止して、変換済みの数値を返します。最初から変換できない時は、0 (atoi)、または 0.0... (atof) を返します。 この時、いずれも正負記号(+/−)を認識します。また、atof は、小数点と指数も認識します。
// 数値への変換
#include <stdio.h> // printf使用
#include <stdlib.h> // atoi, atof使用
#include <conio.h> // getch使用
// main 関数
void main()
{
char s[10] = " -1.2 3";
int i;
i = atoi(s); // int型へ変換
printf("%d\n", i); // -1
double f;
f = atof(s); // double型へ変換
printf("%f\n", f); // -1.20...
if (getch()) return;
}
|
// 数値への変換
#include <stdio.h> // printf使用
#include <stdlib.h> // atoi, atof使用
#include <conio.h> // getch使用
// main 関数
void main()
{
char s[10] = "1.2E3";
int i;
i = atoi(s); // int型へ変換
printf("%d\n", i); // 1
double f;
f = atof(s); // double型へ変換
printf("%f\n", f); // 1200.00...
if (getch()) return;
}
|
sprintf関数を使うと、簡単に数値を文字列に変換して出力することができます。さらに、必要に応じて、様々な書式を指定して変換することが可能です。
| sprintf function |
| 書式 | int sprintf( char *buf, const char *format [ , arg ... ] ); |
| 機能 | データを書式付で文字列に書き出す (末尾にヌル文字が付加される) |
| 引数 | buf...出力先、 format...書式制御文字列、 arg...各データの参照先 |
| 戻り値 | 格納した文字数 (ヌル文字は含まない) |
| 要件 | stdio.h のインクルード |
上記中、書式制御文字列の仕様は、printf関数と同じです。以下は仕様の抜粋です。
| format |
%[flags][width][precision]['h' | 'l']type ([]は省略可) |
| flags | '-'...左詰め / '+'...符号付 / '0'...0詰め / ' '(空白)...正数に空白を付加 / '#'...typeが 'o' の時は 0を、'x' の時は 0xを、'f' 'e' の時は小数点を付加 |
| width | 桁数(文字数)を数字で指定 ('*' : 引数で指定) |
| precision | 小数点以下の桁数(精度)を '.' と数字で指定 ('*' : 引数で指定) |
| 'h' or 'l' | 'h'...short型として解釈 / 'l'...long型として解釈 |
| type | 'd'...十進値 / 'o'...八進値 / 'x'...十六進値 / 'u'...符号なし十進値 / 'f'...浮動小数点(float, double) / 'e'...指数値 / 'p'...ポインタ(アドレス) / 'c'...文字(char) / 's'...文字列 / '%'...'%' 自身 |
// sprintf関数の例
#include <stdio.h> // printf,sprintf使用
#include <conio.h> // getch使用
// main 関数
void main()
{
double f = -123.45;
char s[20];
int n;
n = sprintf(s, "%.3f", f);
if (n) {
printf("%s : %d文字\n", s, n);
} // 出力結果 "-123.450 : 8文字"
if (getch()) return;
}
|
// sprintf関数の例
#include <stdio.h> // printf,sprintf使用
#include <conio.h> // getch使用
// main 関数
void main()
{
double f = 12.3e2;
char s[20];
int n;
n = sprintf(s, "%09.2f", f);
if (n) {
printf("%s : %d文字\n", s, n);
} // 出力結果 "001230.00 : 9文字"
if (getch()) return;
}
|
|
www.sasaraan.net |
(c) morijoh |