Index

HOME > プログラムTOP > C++



C++の壺・データ変換篇

 C++の基本テクニックのTipsです。データ変換篇では、データを変換して出力する方法を扱います。
[index] 大文字と小文字... "大文字⇔小文字" の変換
数値への変換... 文字列から数値への変換
文字列への変換... 数値から文字列への変換

sasaraan programming

Exposition

●大文字と小文字

 アルファベットの大文字と小文字は位置が決まっていますので、それぞれの文字コードの差を算出して加減すれば、大文字または小文字に変換することができます。(参考 : 基本文字コード表

【アルファベットの文字コード】
 ・ 大文字 : '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