[C言語] 文字列と数値を相互に変換し合う方法を解説


C言語では、文字列と数値を相互に変換するために標準ライブラリの関数を利用します。

数値を文字列に変換するには、sprintf関数を使用します。この関数は、数値を指定したフォーマットで文字列に変換し、バッファに格納します。

逆に、文字列を数値に変換するには、atoiatofstrtolstrtodなどの関数を使用します。これらの関数は、文字列を整数や浮動小数点数に変換します。

これらの関数を適切に使用することで、文字列と数値の間での変換が容易になります。

この記事でわかること
  • 文字列から数値への変換方法とエラーハンドリング
  • 数値から文字列への変換方法とフォーマット指定
  • 文字列と数値変換の実践的な応用例
  • 変換時に注意すべきポイントと精度の保ち方

目次から探す

文字列から数値への変換

C言語では、文字列を数値に変換するためのさまざまな関数が用意されています。

これらの関数を使うことで、ユーザー入力やファイルから読み込んだデータを数値として扱うことができます。

以下に、代表的な関数の使い方を解説します。

atoi関数の使い方

atoi関数は、文字列を整数に変換するための関数です。

標準ライブラリのstdlib.hに含まれています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 文字列を整数に変換
    char str[] = "123";
    int num = atoi(str);
    printf("変換された整数: %d\n", num);
    return 0;
}
変換された整数: 123

atoi関数は、文字列の先頭から数字を読み取り、整数に変換します。

ただし、エラー処理がないため、無効な文字列を渡すと予期しない結果になることがあります。

atof関数の使い方

atof関数は、文字列を浮動小数点数に変換するための関数です。

こちらもstdlib.hに含まれています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 文字列を浮動小数点数に変換
    char str[] = "123.45";
    double num = atof(str);
    printf("変換された浮動小数点数: %f\n", num);
    return 0;
}
変換された浮動小数点数: 123.450000

atof関数は、文字列の先頭から数字を読み取り、浮動小数点数に変換します。

こちらもエラー処理がないため、無効な文字列を渡すと予期しない結果になることがあります。

strtol関数の使い方

strtol関数は、文字列を長整数に変換するための関数で、基数を指定することができます。

stdlib.hに含まれています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 文字列を長整数に変換
    char str[] = "12345";
    long num = strtol(str, NULL, 10);
    printf("変換された長整数: %ld\n", num);
    return 0;
}
変換された長整数: 12345

strtol関数は、基数を指定することで、10進数以外の数値も変換することができます。

基数を指定した変換

strtol関数では、基数を指定することで、16進数や8進数の文字列を変換することができます。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 16進数文字列を長整数に変換
    char hexStr[] = "1A3F";
    long hexNum = strtol(hexStr, NULL, 16);
    printf("16進数から変換された長整数: %ld\n", hexNum);
    // 8進数文字列を長整数に変換
    char octStr[] = "123";
    long octNum = strtol(octStr, NULL, 8);
    printf("8進数から変換された長整数: %ld\n", octNum);
    return 0;
}
16進数から変換された長整数: 6719
8進数から変換された長整数: 83

基数を指定することで、異なる進数の文字列を正しく変換することができます。

strtod関数の使い方

strtod関数は、文字列を倍精度浮動小数点数に変換するための関数です。

stdlib.hに含まれています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 文字列を倍精度浮動小数点数に変換
    char str[] = "123.456";
    double num = strtod(str, NULL);
    printf("変換された倍精度浮動小数点数: %f\n", num);
    return 0;
}
変換された倍精度浮動小数点数: 123.456000

strtod関数は、atof関数と異なり、エラー処理が可能です。

エラーハンドリングの方法

文字列から数値への変換では、無効な文字列が渡された場合にエラーを処理することが重要です。

strtolstrtod関数では、エラーハンドリングが可能です。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
    // 無効な文字列を変換
    char str[] = "abc";
    char *endptr;
    errno = 0; // エラー番号をリセット
    long num = strtol(str, &endptr, 10);
    if (errno != 0 || *endptr != '\0') {
        printf("変換エラーが発生しました。\n");
    } else {
        printf("変換された数値: %ld\n", num);
    }
    return 0;
}
変換エラーが発生しました。

strtolstrtod関数では、変換に失敗した場合にerrnoをチェックし、endptrを使って変換が成功したかどうかを確認することができます。

これにより、無効な文字列が渡された場合でも適切にエラーを処理することができます。

数値から文字列への変換

数値を文字列に変換することは、データの表示やファイルへの書き込みなどでよく行われます。

C言語では、数値を文字列に変換するためのいくつかの関数が用意されています。

以下に、代表的な関数の使い方を解説します。

sprintf関数の使い方

sprintf関数は、数値を文字列に変換し、指定したバッファに書き込むための関数です。

stdio.hに含まれています。

#include <stdio.h>
int main() {
    // 整数を文字列に変換
    int num = 123;
    char str[10];
    sprintf(str, "%d", num);
    printf("変換された文字列: %s\n", str);
    return 0;
}
変換された文字列: 123

sprintf関数は、フォーマット指定子を使って数値を文字列に変換します。

バッファのサイズに注意が必要です。

snprintf関数の使い方

snprintf関数は、sprintf関数と同様に数値を文字列に変換しますが、バッファのサイズを指定することができます。

これにより、バッファオーバーフローを防ぐことができます。

#include <stdio.h>
int main() {
    // 浮動小数点数を文字列に変換
    double num = 123.456;
    char str[20];
    snprintf(str, sizeof(str), "%.2f", num);
    printf("変換された文字列: %s\n", str);
    return 0;
}
変換された文字列: 123.46

snprintf関数は、バッファのサイズを指定することで、安全に文字列を生成することができます。

itoa関数の使い方

itoa関数は、整数を文字列に変換するための非標準関数です。

標準ライブラリには含まれていないため、使用する際は注意が必要です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 整数を文字列に変換
    int num = 123;
    char str[10];
    itoa(num, str, 10);
    printf("変換された文字列: %s\n", str);
    return 0;
}
変換された文字列: 123

itoa関数は、基数を指定して整数を文字列に変換します。

ただし、移植性に欠けるため、使用は推奨されません。

gcvt関数の使い方

gcvt関数は、浮動小数点数を文字列に変換するための非標準関数です。

こちらも標準ライブラリには含まれていないため、使用する際は注意が必要です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    // 浮動小数点数を文字列に変換
    double num = 123.456;
    char str[20];
    gcvt(num, 6, str);
    printf("変換された文字列: %s\n", str);
    return 0;
}
変換された文字列: 123.456

gcvt関数は、指定した桁数で浮動小数点数を文字列に変換します。

こちらも移植性に欠けるため、使用は推奨されません。

変換時のフォーマット指定

数値を文字列に変換する際には、フォーマット指定子を使って出力形式を指定することができます。

以下に、よく使われるフォーマット指定子を示します。

スクロールできます
フォーマット指定子説明
%d整数
%f浮動小数点数
%e指数表記の浮動小数点数
%x16進数
%o8進数

フォーマット指定子を使うことで、数値を希望する形式で文字列に変換することができます。

たとえば、%.2fを使うと、小数点以下2桁までの浮動小数点数を文字列に変換できます。

文字列と数値変換の応用例

文字列と数値の変換は、さまざまな場面で応用されます。

ここでは、具体的な応用例をいくつか紹介します。

ユーザー入力の数値変換

ユーザーからの入力を数値として扱うためには、文字列を数値に変換する必要があります。

以下の例では、ユーザーから入力された文字列を整数に変換しています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    char input[10];
    printf("整数を入力してください: ");
    fgets(input, sizeof(input), stdin);
    int num = atoi(input);
    printf("入力された整数: %d\n", num);
    return 0;
}
整数を入力してください: 42
入力された整数: 42

このように、ユーザーからの入力を数値に変換することで、計算や条件分岐に利用できます。

ファイルから読み込んだデータの変換

ファイルから読み込んだデータを数値として扱う場合も、文字列から数値への変換が必要です。

以下の例では、ファイルから読み込んだ文字列を整数に変換しています。

#include <stdio.h>
#include <stdlib.h>
int main() {
    FILE *file = fopen("data.txt", "r");
    if (file == NULL) {
        perror("ファイルを開けませんでした");
        return 1;
    }
    char buffer[10];
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        int num = atoi(buffer);
        printf("読み込んだ整数: %d\n", num);
    }
    fclose(file);
    return 0;
}
読み込んだ整数: 100
読み込んだ整数: 200

ファイルからのデータを数値に変換することで、データの集計や分析が可能になります。

数値データのフォーマット出力

数値を特定のフォーマットで出力することは、レポートやログの作成に役立ちます。

以下の例では、数値を通貨形式で出力しています。

#include <stdio.h>
int main() {
    double price = 1234.567;
    printf("価格: $%.2f\n", price);
    return 0;
}
価格: $1234.57

フォーマット指定子を使うことで、数値を見やすい形式で出力することができます。

数値計算結果の文字列化

計算結果を文字列として保存したり表示したりする場合、数値を文字列に変換します。

以下の例では、計算結果を文字列に変換しています。

#include <stdio.h>
int main() {
    int a = 5, b = 3;
    int result = a + b;
    char resultStr[10];
    sprintf(resultStr, "%d", result);
    printf("計算結果: %s\n", resultStr);
    return 0;
}
計算結果: 8

計算結果を文字列に変換することで、他の文字列と結合したり、ファイルに保存したりすることができます。

データベースとのデータ交換

データベースとのデータ交換では、文字列と数値の変換が頻繁に行われます。

SQLクエリを作成する際に、数値を文字列に変換してクエリに組み込むことが一般的です。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int userId = 42;
    char query[100];
    snprintf(query, sizeof(query), "SELECT * FROM users WHERE id = %d;", userId);
    printf("SQLクエリ: %s\n", query);
    return 0;
}
SQLクエリ: SELECT * FROM users WHERE id = 42;

このように、数値を文字列に変換してSQLクエリを作成することで、データベースとのやり取りが可能になります。

よくある質問

文字列から数値に変換する際のエラーを防ぐには?

文字列から数値に変換する際のエラーを防ぐためには、以下の方法を考慮することが重要です。

  • strtolstrtod関数を使用し、変換後にerrnoをチェックすることで、変換エラーを検出できます。
  • endptrを利用して、変換が成功したかどうかを確認し、変換できなかった部分がないかをチェックします。
  • 入力文字列が数値として妥当かどうかを事前に検証するために、正規表現や手動でのチェックを行うことも有効です。

変換時に精度を保つ方法は?

数値を文字列に変換する際に精度を保つためには、以下の点に注意してください。

  • 浮動小数点数を文字列に変換する際は、%.nfのようにフォーマット指定子を使って小数点以下の桁数を指定します。
  • snprintf関数を使用して、バッファサイズを指定することで、バッファオーバーフローを防ぎつつ、精度を保つことができます。
  • 倍精度浮動小数点数を扱う場合は、strtod関数を使用して、精度を保ちながら変換を行います。

文字列と数値の変換で注意すべき点は?

文字列と数値の変換において注意すべき点は以下の通りです。

  • バッファサイズを適切に設定し、バッファオーバーフローを防ぐことが重要です。
  • 非標準関数(例:itoagcvt)は移植性に欠けるため、使用を避けるか、使用する際は注意が必要です。
  • 変換時にエラーが発生する可能性があるため、エラーハンドリングを適切に行うことが重要です。

まとめ

文字列と数値の変換は、C言語プログラミングにおいて頻繁に行われる操作です。

この記事では、文字列から数値への変換、数値から文字列への変換、そしてそれらの応用例について詳しく解説しました。

これらの知識を活用することで、プログラムの入力処理やデータの表示がより効果的に行えるようになります。

ぜひ、実際のプログラムでこれらの技術を試してみてください。

  • URLをコピーしました!
目次から探す