C言語のきほん|一般ユーティリティ関数を使う

文字列を数値に変えて、入力をもっと柔軟に。atoi と atof を知ると、C言語の実用性がぐっと高まる

C言語の標準ライブラリには、プログラムを書くときに「あると助かる便利な機能」がたくさん用意されています。
その中でも、特定の分野に限らず幅広く役立つ関数群が、一般ユーティリティ関数です。

「ユーティリティ」という言葉には、「役に立つもの」「便利なもの」という意味があります。
名前のとおり、一般ユーティリティ関数は、日々のプログラム作成でよく出てくる処理を助けてくれる便利な関数たちです。

たとえば、次のような場面で使われます。

  • 文字列を整数や実数に変換したい
  • 乱数を作りたい
  • 実行時に必要な大きさのメモリを確保したい

この節では、その中でも特に使う機会の多い

  • 文字列を数値に変換する関数
  • 疑似乱数を生成する関数

の考え方につながる基本として、まず atoi と atof を中心に見ていきます。

C言語では、キーボード入力やコマンドライン引数など、多くの入力が「文字列」として入ってきます。
でも、実際の計算では、その文字列を数値として使いたいことがよくあります。
そんなときに活躍するのが atoi と atof です。

また、入力をいったん文字列として受け取る方法は、単に変換に便利なだけではありません。
scanf で直接 %d や %lf を使うよりも、入力ミスへの対応を考えやすいという利点もあります。
特に「end と入力したら終了する」といった柔軟な入力処理を作りやすくなるのは、大きな魅力です。

この節では、一般ユーティリティ関数とは何かを確認したあと、atoi と atof の役割、使い方、注意点、そして文字列入力と組み合わせる実践的な考え方まで、順番にやさしく見ていきます。

一般ユーティリティ関数とは

一般ユーティリティ関数とは、特定のテーマだけに限らず、さまざまな場面で役立つ便利な処理を提供する関数群です。
これらの関数は、標準ヘッダファイル stdlib.h に定義されています。

使うときは、まず次のように書きます。

#include <stdlib.h>

一般ユーティリティ関数には、たとえば次のような用途があります。

用途
文字列を数値に変換するatoi、atof
疑似乱数を生成するsrand、rand
動的にメモリを確保するmalloc、free

この節では、その中でも特に身近で実用的な「文字列を数値に変換する関数」を中心に見ていきます。

文字列を数値に変換したい場面

プログラムでは、入力された内容を数値として扱いたいことがよくあります。
たとえば、次のような場面です。

場面
キーボード入力入力された 123 を整数として使いたい
終了条件つき入力end と入力したら終了、それ以外は数値として加算したい
コマンドライン引数実行時に渡された文字列を数値に変換したい
文字列処理のあと数字だけ抜き出した文字列を数値として使いたい

こうした場面では、まず文字列として受け取り、それをあとで数値に変換する方法がとても便利です。

atoi と atof とは

文字列を数値に変換する代表的な関数が atoi と atof です。

関数名役割
atoi文字列を int 型整数に変換する
atof文字列を double 型実数に変換する

名前の意味をざっくり言うと、次のように考えると覚えやすいです。

  • atoi は ASCII to integer
  • atof は ASCII to floating-point

つまり、文字列を整数や実数へ変換する関数です。

atoi 関数とは

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

関数宣言

#include <stdlib.h>

int atoi(const char *nptr);

機能

nptr が指す文字列を int 型の整数に変換します。

返却値

変換された整数値を返します。

使用例

int n = atoi("123");

この場合、n には 123 が入ります。

atoi のイメージ

atoi は、文字列の中に並んでいる数字を「整数として解釈」して返します。

たとえば、

文字列atoi の結果
123123
-45-45
00

となります。

この関数のイメージを図にすると、理解しやすくなります。

この図では、文字列として保存されている 1、2、3 が、atoi によって整数値 123 に変換される流れを表しています。
見た目は同じ数字でも、文字列と整数ではプログラムの中での扱いがまったく違います。
atoi は、その橋渡しをしてくれる関数です。

atof 関数とは

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

関数宣言

#include <stdlib.h>

double atof(const char *nptr);

機能

nptr が指す文字列を double 型に変換します。

返却値

変換された浮動小数点数を返します。

使用例

double x = atof("123.456");

この場合、x には 123.456 が入ります。

atof のイメージ

atof は、整数だけでなく小数点を含む文字列も実数として解釈できます。

文字列atof の結果
3.143.14
-2.5-2.5
100100.0

この図では、文字列 123.456 が atof によって double 型の値へ変換される流れを表しています。
整数だけでなく、小数を含む文字列も数値として使えるようになるのが atof の便利な点です。

なぜ文字列として入力するのか

ここはとても大切な考え方です。

C言語では、scanf で %d や %lf を使えば、直接整数や実数を入力できます。
でも、入力内容によっては、いったん文字列として受け取ったほうが扱いやすいことがあります。

たとえば、次のようなケースです。

数値以外の終了条件を使いたい場合

たとえば、数値を入力し続けて、end と入力したら終了したいとします。
このとき、最初から %lf で入力を受けると、end は数値ではないため困ってしまいます。

一方、文字列として受け取れば、

  • end かどうかを比較する
  • end でなければ atof で数値に変換する

という流れにできます。

誤入力によるトラブルを減らしたい場合

scanf で %d を使っているときに、英字を入力すると入力不一致になり、バッファに文字が残ってしまうことがあります。
その結果、同じ入力を何度も読んでしまい、意図しないループになることもあります。

これを避けるために、まず文字列として受け取り、あとで必要なら atoi や atof で変換する方法が役立ちます。

atoi と atof の注意点

atoi と atof は便利ですが、厳密なエラー判定には向いていません。

たとえば、変換できない文字列を渡した場合でも、単純に 0 を返すことがあります。

入力文字列atoi / atof の結果例
abc0
xyz0.0

このため、

  • 本当に 0 を入力したのか
  • 変換失敗で 0 になったのか

の区別がつきにくいです。

厳密に検証したい場合は、strtol や strtod のような関数を使う方法があります。
ただし、この節ではまず基本として atoi と atof の使い方を押さえることが大切です。

atoi を使ったシンプルなサンプルプログラム

整数を入力し、負の値が入力されるまで繰り返すプログラムです。

ファイル名:12_14_1.c

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

int main(void)
{
    int value;
    char text[100];

    do {
        printf("整数を入力してください(終了条件:負の値)> ");

        /* 文字列として受け取る */
        scanf("%99s", text);

        /* 文字列を整数に変換する */
        value = atoi(text);

        printf("変換後の値: %d\n", value);

    } while (value >= 0);

    return 0;
}

実行イメージ

整数を入力してください(終了条件:負の値)> 3
変換後の値: 3
整数を入力してください(終了条件:負の値)> 8
変換後の値: 8
整数を入力してください(終了条件:負の値)> abc
変換後の値: 0
整数を入力してください(終了条件:負の値)> -1
変換後の値: -1

この例では、abc のような入力でもプログラムが止まらず、0 に変換されることがわかります。

このプログラムのポイント

このプログラムでは、まず

scanf("%99s", text);

で文字列として入力を受けています。

そのあと、

value = atoi(text);

で整数へ変換しています。

このように、入力と変換を分けることで、数値だけでなく文字列入力もいったん受け止められるのが特徴です。

atof を使ったシンプルなサンプルプログラム

次は、終了文字列つきで実数を合計する例です。
元の内容を少しやさしい表現に変えています。

ファイル名:12_14_2.c

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

int main(void)
{
    double number;
    double total = 0.0;
    char text[100];

    while (1) {
        printf("数値を入力してください(終了条件:stop または STOP)> ");
        scanf("%99s", text);

        /* 終了文字列なら繰り返し終了 */
        if (!strcmp(text, "stop") || !strcmp(text, "STOP")) {
            break;
        }

        /* 文字列を実数に変換する */
        number = atof(text);
        total += number;
    }

    printf("合計は %f です。\n", total);

    return 0;
}

実行イメージ

数値を入力してください(終了条件:stop または STOP)> 10.5
数値を入力してください(終了条件:stop または STOP)> 2.25
数値を入力してください(終了条件:stop または STOP)> 7.0
数値を入力してください(終了条件:stop または STOP)> stop
合計は 19.750000 です。

このプログラムのポイント

この例では、数値だけでなく終了文字列 stop も受け取れるようにしています。
これは、入力を文字列として受け取っているから実現できる処理です。

流れを表にすると、次のようになります。

手順内容
1文字列として入力を受け取る
2stop または STOP かどうか確認する
3終了条件でなければ atof で実数に変換する
4合計へ加算する

このように、atoi や atof は単なる変換関数ではなく、柔軟な入力処理を作るための道具としても役立ちます。

atoi と atof を使うときの考え方

使うときの基本の流れは次のように整理できます。

手順内容
1入力を文字列として受け取る
2必要なら終了条件の文字列を判定する
3atoi または atof で数値へ変換する
4計算や条件判定に使う

この考え方に慣れておくと、複雑な入力処理にも対応しやすくなります。

よくある使い分け

やりたいこと使う関数
文字列を整数にしたいatoi
文字列を実数にしたいatof
変換失敗も厳密に調べたいstrtol / strtod など

最初のうちは、atoi と atof で「文字列を数値に変えられる」という基本感覚をつかむことが大切です。

一般ユーティリティ関数を学ぶ意味

atoi と atof を理解すると、C言語での入力処理がぐっと柔軟になります。

学べること内容
文字列と数値の違い同じ数字でも扱い方が違うことがわかる
文字列入力の利点終了文字列などを扱いやすくなる
変換関数の使い方atoi と atof の基本が身につく
入力処理の安全性直接数値入力するより柔軟に作れる
実用的な発想入力→判定→変換→計算の流れがわかる

一般ユーティリティ関数は、派手ではありませんが、実際のプログラム作りでとても役立つ関数群です。
その中でも atoi と atof は、文字列入力と数値計算をつなぐ大切な橋渡し役になります。