Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語入門】独自のatoi()関数を作る方法と実装例をわかりやすく解説

atoi()は、数字で構成された文字列を整数値に変換するための標準ライブラリ関数です。stdlib.hヘッダーに宣言されており、C言語プログラミングにおいて非常によく使われる関数の一つです。

標準のatoi()関数の動作

まず、atoi()がどのように動作するのか、基本的な例を見てみましょう。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    int value;
    char string1[] = "3567";
    
    value = atoi(string1);
    printf("String value = %s\n", string1);
    printf("Integer value = %d\n", value);
    
    char string2[] = "TutorialsPoint";
    
    value = atoi(string2);
    printf("String value = %s\n", string2);
    printf("Integer value = %d\n", value);
    
    return (0);
}

実行結果は以下の通りです。

String value = 3567
Integer value = 3567
String value = TutorialsPoint
Integer value = 0

この例から分かるように、atoi()は純粋な数字の文字列「3567」を正しく整数3567へ変換します。一方、数字以外の文字を含む「TutorialsPoint」のような文字列の場合、変換は行われず0が返されます。

独自のatoi()関数(カスタムatoi)を作成するには?

atoi()は数字の文字列だけを整数に変換するため、実際に自作する場合は文字列の妥当性チェックが必要になります。

変換のルールとして、以下の点を押さえておきましょう。

  • 先頭の空白文字(スペース)はスキップして読み飛ばす
  • 先頭に+-の符号がある場合はそれを考慮する
  • 数字以外の文字に出会った時点で、文字列から整数への変換を中断する
  • 有効な数字が一つもなければ0を返す

これらのルールを実装したカスタムatoi()関数のサンプルコードが以下です。

カスタムatoi()の実装例

#include <stdio.h>

int myAtoi(const char *str){
    int result = 0;   /* 変換結果を格納 */
    int sign = 1;     /* 符号:デフォルトは正 */
    int i = 0;
    
    /* 先頭の空白文字をスキップ */
    while (str[i] == ' ' || str[i] == '\t') {
        i++;
    }
    
    /* 符号の判定 */
    if (str[i] == '-' || str[i] == '+') {
        if (str[i] == '-') {
            sign = -1;
        }
        i++;
    }
    
    /* 数字以外の文字が出たら変換を終了 */
    while (str[i] >= '0' && str[i] <= '9') {
        result = result * 10 + (str[i] - '0');
        i++;
    }
    
    return sign * result;
}

int main(){
    printf("%d\n", myAtoi("12345"));   /* 出力:12345 */
    printf("%d\n", myAtoi("-678"));    /* 出力:-678 */
    printf("%d\n", myAtoi("12abc34")); /* 出力:12(数字以外で停止) */
    printf("%d\n", myAtoi("abc"));     /* 出力:0 */
    return 0;
}

実装のポイント

このカスタム関数の核となるのは、result * 10 + (str[i] - '0')という計算式です。各桁の文字から文字コード'0'を引くことで数値(0〜9)を取り出し、既存の結果を10倍して左にずらしながら新しい桁を追加していきます。

また、ループ条件で文字が'0''9'の範囲内かどうかを毎回チェックしているため、英字などの非数値文字が出現した瞬間に変換が自動的に停止し、そこまでの結果が返される仕組みになっています。

このように、標準のatoi()の動作を理解し、自分で実装することで、文字列処理やポインタ・ASCIIコードの扱いに対する理解も深まります。ぜひ手を動かして試してみてください。

  1. C#でSortedListを作成する方法をわかりやすく解説

    C#のSortedListは、キーに基づいて自動的にソートされるキーと値(Key-Value)ペアのコレクションです。要素は常にキーの順序で格納され、キーやインデックスを使ってアクセスできるのが特徴です。 SortedListを作成するには、System.Collections名前空間をインポートした上で、new SortedList()によりインスタンスを生成し、Add()メソッドで要素を追加していきます。 例1:基本的なSortedListの作成 以下のコードでは、文字列のキーと値を持つSortedListを作成し、foreachループと列挙子(Enumerator)の2通りの方法で要素を

  2. コーディング不要!Alexaブループリントでオリジナルスキルを作成する方法

    スマートスピーカー市場には魅力的な製品が数多くありますが、Amazon Echo(Alexa搭載)には、他社がまだ提供していない便利な機能があります。それが、プログラミング知識ゼロでも自分だけのスキルを作成できる機能です。 Alexaブループリントとは? Alexaブループリントは、Alexa体験を自由にカスタマイズするための新しい仕組みです。簡単に言えば、コーディングなしで自宅専用のオリジナルスキルを作れる「テンプレート」のこと。やることは空欄を埋めるだけで、驚くほど簡単です。 スキルを作成すると、デフォルト設定では自分のアカウント内でのみ利用可能になります。ただし、希望すれば友人や家族