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

C言語のprintf()、sprintf()、fprintf()の違いと使い方を徹底解説

はじめに

C言語には、テキストを出力するための関数がいくつか用意されています。その中でも代表的なのが printf()sprintf()fprintf() の3つです。いずれも書式指定付きでデータを出力できる点は共通していますが、出力先が異なるという大きな違いがあります。本記事では、それぞれの構文と具体的な使用例を交えながら、3つの関数の役割と使い分けのポイントをわかりやすく解説します。


printf()

printf() は、メッセージや変数の値を標準出力(コンソール画面)に表示するための関数です。C言語プログラミングにおいて最も基本的かつ頻繁に使われる出力関数といえます。

C言語における printf() の構文は以下の通りです。

printf(const char *str, ...);

以下は、C言語での printf() の使用例です。

使用例

#include<stdio.h>
int main() {
    int a = 24;
    printf("Welcome! \n");
    printf("The value of a : %d",a);
    getchar();
    return 0;
}

実行結果

Welcome!
The value of a : 24

sprintf()

sprintf() は「string print(文字列出力)関数」とも呼ばれます。この関数は文字列を画面に表示しません。代わりに、書式化した文字列や値の並びを char 型のバッファ(配列)に格納します。後からそのバッファを使って出力したり、文字列を組み立てたりする際に非常に便利です。

C言語における sprintf() の構文は以下の通りです。

int sprintf(char *str, const char *string,...);

以下は、C言語での sprintf() の使用例です。

使用例

#include<stdio.h>
int main() {
    char buf[20];
    int x = 15, y = 25, z;
    z = x + y;
    sprintf(buf, "Sum of values : %d", z);
    printf("%s", buf);
    return 0;
}

実行結果

Sum of values : 40

fprintf()

fprintf() は「format print(書式付き出力)関数」とも呼ばれます。この関数は、出力を指定したストリームに対して書き込み、書式化します。メッセージを出力できますが、stdout(標準出力)のコンソールには表示されません。主にファイルへの書き込みなどに使用されます。

C言語における fprintf() の構文は以下の通りです。

int fprintf(FILE *fptr, const char *str, ...);

以下は、C言語での fprintf() の使用例です。

使用例

#include<stdio.h>
int main() {
    int i, x = 4;
    char s[20];
    FILE *f = fopen("new.txt", "w");
    if (f == NULL) {
        printf("Could not open file");
        return 0;
    }
    for (i=0; i<x; i++) {
        puts("Enter text");
        gets(s);
        fprintf(f,"%d.%s\n", i, s);
    }
    fclose(f);
    return 0;
}

実行結果

Enter text
Hello world!
Enter text
Demo

このプログラムを実行すると、「new.txt」ファイルの内容が更新されます。更新後のファイルの中身は以下の通りです。

0,Hello world!
1,Demo

※なお、上記のコードで使用している gets() はバッファオーバーフローの危険性があるため、現在では非推奨の関数です。実際の開発では、安全な fgets() の使用が推奨されます。

まとめ:3つの関数の違い

関数名出力先主な用途
printf()標準出力(コンソール)画面へのメッセージ表示
sprintf()char型バッファ(配列)文字列の組み立て・保存
fprintf()指定したストリーム(ファイルなど)ファイルへの書き込み

このように、3つの関数は書式指定の方法こそ共通していますが、出力先によって使い分けられています。目的に応じて適切な関数を選択することで、より効率的で読みやすいコードを書くことができます。

  1. C++で円と長方形の重なりを判定するアルゴリズム

    問題の概要円を (radius, xc, yc) という形式で表します。ここで (xc, yc) は円の中心座標です。同様に、軸に平行な長方形(軸平行境界ボックス)を (x1, y1, x2, y2) という形式で表し、(x1, y1) が左下隅の座標、(x2, y2) が右上隅の座標とします。このとき、円と長方形が互いに重なっているかどうかを判定する必要があります。たとえば、次のような入力が与えられた場合を考えてみましょう。この場合、出力は true(重なりあり)となります。解決のアプローチこの問題を解く鍵は、「長方形の中で円の中心に最も近い点」を見つけることです。その点と円の中心との距離が

  2. C++で解くドミノとトロミノを使ったタイル敷き詰め問題(2×Nボード)

    問題の概要本記事では、「ドミノ」と「トロミノ」という2種類の形状を使ったタイル敷き詰め(タイリング)問題をC++で解く方法を解説します。これらのピースは、以下のように回転させて使用することができます。タイリングでは、盤面上のすべてのマスを必ずタイルで覆わなければなりません。また、2つのタイリング方法は、盤上の4方向に隣接する2つのセルにおいて、片方のタイリングだけがその両方のマスを同じタイルで占有している場合に限り「異なる」とみなされます。入力と出力の例整数Nが与えられたとき、2×Nのボードを敷き詰める方法が何通りあるかを求めます。例えば、入力が3の場合、出力は5となります。敷き詰め方は以下の