文字列を数値に変換する
この記事では、C言語で取得した文字列を数値に変換する方法について記載する。
1. 目的
・C言語で取得した文字列を数値に変換する方法はいくつかあり、
その方法(関数について)理解する。
目次
2. atoi関数を使用する方法
2.1atoi関数とは
atoi関数は、文字列を整数に変換するための関数です。
たとえば、"123"という文字列を、123という整数に変換することができます。
この関数は、C言語の標準ライブラリに含まれており、
比較的簡単に使用することができます。
2.2 使用方法:
①変換したい文字列を指定する。
②変換後の整数が代入される変数を指定する。
③変換に使用する基数を指定する(10進数の場合は10を指定する)。
関数:int atoi(const char* str);
例:
char str[] = "123"; int num = atoi(str);
注: この関数は、引数として与えた文字列が数字以外の文字を含んでいる場合、変換が中断されます。
例えば、"123abc"という文字列を変換する場合、"123"の部分までが変換され、"abc"の部分は無視されます。
2.3 プログラム作成(atoi関数)
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "123"; int num; num = atoi(str); printf("%d\n", num); // 出力結果: 123 return 0; }
実行結果:https://paiza.io/projects/iywq6PhdEFJGys1h1D352Q
2.4 プログラム作成(atoi関数:数値以外)
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "hello"; int num; num = atoi(str); printf("文字列 \"%s\" を整数値に変換すると %d になります。\n", str, num); return 0; }
結果:https://paiza.io/projects/SE0xgYfTzXbQXnkznn1dTQ?language=c
3. strtol関数を使用する方法
3.1 strtol関数とは
strtol関数は、文字列を整数値に変換するための関数です。
先頭に+、-の符号がある場合、符号も考慮されます。
変換された整数値が返されます。
たとえば、「123」という文字列をstrtol関数で変換する場合、
123の整数値が得られます。
「-123」という文字列をstrtol関数で変換する場合、-123の整数値が得られます。
3.2 使用方法(strtol関数)
・long int strtol(const char *nptr, char **endptr, int base);
・引数の説明は以下の通りです。
・nptr: 変換する文字列へのポインタ
・ endptr: 最初に変換されなかった文字列の先頭へのポインタ。
この引数にNULLを指定すると、変換されなかった文字列を返しません。
・base: 数値として解釈するための基数。
10進数を使用する場合は10、16進数を使用する場合は16を指定します。
3.3 プログラム作成(strtol関数)
#include <stdio.h> #include <stdlib.h> int main() { char str[] = "123"; char *endptr; long int num; num = strtol(str, &endptr, 10); printf("%ld\n", num); return 0; }
結果:https://paiza.io/projects/4T6lhyqaJKiRr5cREGHDNg?language=c
4. sscanf関数を使用する方法
4.1 sscanf関数とは
C言語では、文字列から必要な情報を取り出すための関数が用意されています。
その中でも、文字列から指定したフォーマットに従って変数に値を代入する関数が「sscanf」です。
「sscanf」は、文字列、変換指定子、変数を指定して使用します。
例えば、以下のようなコードで文字列から整数値を取得することができます。
4.2 使用方法
・sscanf関数の書式は以下の通りです。
int sscanf(const char *str, const char *format, ...);
・引数の説明は以下の通りです。
・str: データを読み込む文字列へのポインタ
・format: データの書式を指定する文字列
・...: 変換された値を格納するための変数のリスト
4.3 プログラム作成(sscanf関数)
#include <stdio.h> int main() { char str[] = "123"; int num; sscanf(str, "%d", &num); printf("%d\n", num); return 0; }
結果:https://paiza.io/projects/iyJ36W6DOEq671aN2JYsRQ?language=c
5. sscanfのメリット、デメリット
・「atoi関数」は、文字列を整数に変換する関数です。
しかし、この関数は文字列が数字以外の文字を含んでいる場合、正しく変換できないという欠点があります。
・「strtol関数」は、文字列を長整数型に変換する関数です。
この関数は、第2引数で指定した文字の最初の数字から、最後の数字までを変換します。
この関数は、エラー処理もしっかりしているので、数値以外の文字が含まれている場合でもエラーを返すため、正確な変換ができます。
・「sscanf関数」は、文字列から指定されたフォーマットに従って、複数の変数に値を読み込むことができます。
この関数は、変換に失敗した場合は「0」を返すため、変換が成功したかどうかを判断することができます。
使い分けとしては、
・「atoi関数」は、単純な数値変換に使用します。
・「strtol関数」は、数値以外の文字列を含んでいる場合や、変換後の値が長整数型である場合に使用することが適しています。
・「sscanf関数」は、文字列の中から特定の書式に従って複数の変数を読み取る場合に使用することができます。
以下に、メリット、デメリットをまとめます。
関数名 | メリット | デメリット |
---|---|---|
atoi関数 |
簡単な数値変換に使用可能で、 簡潔なコードを書けることができる。 |
数値以外の文字列が渡された場合、0を返すためエラー処理が必要。 long int型以上の数値は変換できないため、範囲外の値が渡された場合もエラー処理が必要。 |
strtol関数 |
数値以外の文字列が含まれる場合や、long int型以上の変換を必要とする場合に使用できる。 long int型以上の範囲の数値も変換可能。 |
エラーが起こった場合、戻り値としてエラーの種類を返すため、エラー処理が複雑になることがある。 |
sscanf関数 |
入力された文字列から指定したフォーマットに基づいてデータを読み取ることができる。 可読性が高く、柔軟性があり、コードの再利用性が高い。 |
文字列の長さが予測できない場合、 バッファオーバーフローの可能性があるため、注意が必要。 |
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary
・C言語基礎知識6(関数) - Project_OKI’s diary
・C言語基礎知識7(構造体1) - Project_OKI’s diary
・C言語基礎知識8(enum:列挙型) - Project_OKI’s diary
・C言語基礎知識9(typedef) - Project_OKI’s diary