[C言語] よく使用する関数一覧

C言語では、標準ライブラリに多くの便利な関数が用意されています。これらの関数は、プログラムの効率を高め、コードの可読性を向上させます。

例えば、文字列操作にはstrcpystrlenstrcatなどがあり、これらは文字列のコピー、長さの取得、連結を行います。

入出力操作にはprintfscanfがあり、これらはコンソールへの出力や入力を簡単に行うことができます。

メモリ管理にはmallocfreeがあり、動的メモリの確保と解放を行います。

これらの関数を適切に使用することで、C言語プログラムの開発がよりスムーズになります。

この記事でわかること
  • 標準入出力関数の使い方と応用例
  • 文字列操作関数を用いた文字列処理
  • メモリ管理関数による動的メモリの効率的な使用
  • 数学関数を用いた計算とグラフ描画
  • ファイル操作関数を用いたファイルの読み書きとエラー処理
  • 時間関連関数を用いた時間の取得と計測方法

目次から探す

標準入出力関数

C言語の標準入出力関数は、コンソールを通じてデータを入力したり出力したりするための基本的な機能を提供します。

これらの関数を理解することで、ユーザーとのインタラクションを行うプログラムを作成することができます。

printf関数

printf関数は、フォーマットされた出力を行うための関数です。

様々なデータ型を指定した形式でコンソールに出力することができます。

#include <stdio.h>
int main() {
    int number = 10;
    printf("数値は%dです。\n", number); // %dは整数を出力するためのフォーマット指定子
    return 0;
}
数値は10です。

この例では、整数型の変数numberの値を%dフォーマット指定子を使って出力しています。

scanf関数

scanf関数は、標準入力からデータを読み取るための関数です。

ユーザーからの入力を受け取る際に使用します。

#include <stdio.h>
int main() {
    int number;
    printf("数値を入力してください: ");
    scanf("%d", &number); // %dは整数を読み取るためのフォーマット指定子
    printf("入力された数値は%dです。\n", number);
    return 0;
}
数値を入力してください: 25
入力された数値は25です。

この例では、ユーザーから整数を入力してもらい、その値を変数numberに格納しています。

getchar関数

getchar関数は、標準入力から1文字を読み取るための関数です。

主に文字単位での入力を処理する際に使用します。

#include <stdio.h>
int main() {
    char ch;
    printf("1文字を入力してください: ");
    ch = getchar();
    printf("入力された文字は%cです。\n", ch);
    return 0;
}
1文字を入力してください: A
入力された文字はAです。

この例では、ユーザーから1文字を入力してもらい、その文字を変数chに格納しています。

putchar関数

putchar関数は、1文字を標準出力に書き込むための関数です。

単一の文字を出力する際に使用します。

#include <stdio.h>
int main() {
    char ch = 'B';
    printf("出力する文字: ");
    putchar(ch);
    printf("\n");
    return 0;
}
出力する文字: B

この例では、変数chに格納された文字をputchar関数を使って出力しています。

gets関数とfgets関数

gets関数は、標準入力から文字列を読み取るための関数ですが、安全性の問題から使用は推奨されていません。

代わりにfgets関数を使用します。

#include <stdio.h>
int main() {
    char buffer[100];
    printf("文字列を入力してください: ");
    fgets(buffer, sizeof(buffer), stdin); // fgetsはバッファサイズを指定して安全に文字列を読み取る
    printf("入力された文字列は%sです。\n", buffer);
    return 0;
}
文字列を入力してください: Hello, World!
入力された文字列はHello, World!
です。

この例では、fgets関数を使って文字列を安全に読み取っています。

puts関数

puts関数は、文字列を標準出力に書き込むための関数です。

文字列の末尾に自動的に改行を追加します。

#include <stdio.h>
int main() {
    char message[] = "こんにちは、世界!";
    puts(message); // putsは文字列を出力し、改行を追加する
    return 0;
}
こんにちは、世界!

この例では、messageに格納された文字列をputs関数を使って出力しています。

puts関数は出力後に自動的に改行を行います。

文字列操作関数

C言語では、文字列を操作するための様々な関数が用意されています。

これらの関数を使用することで、文字列のコピー、結合、比較、検索などの操作を簡単に行うことができます。

strcpy関数

strcpy関数は、文字列を別の文字列にコピーするための関数です。

コピー先のバッファが十分なサイズを持っていることを確認する必要があります。

#include <stdio.h>
#include <string.h>
int main() {
    char source[] = "Hello, World!";
    char destination[50];
    strcpy(destination, source); // sourceの内容をdestinationにコピー
    printf("コピーされた文字列: %s\n", destination);
    return 0;
}
コピーされた文字列: Hello, World!

この例では、sourceの内容をdestinationにコピーしています。

strcat関数

strcat関数は、2つの文字列を結合するための関数です。

結合先のバッファが十分なサイズを持っていることを確認する必要があります。

#include <stdio.h>
#include <string.h>
int main() {
    char str1[50] = "Hello";
    char str2[] = ", World!";
    strcat(str1, str2); // str1にstr2を結合
    printf("結合された文字列: %s\n", str1);
    return 0;
}
結合された文字列: Hello, World!

この例では、str1str2を結合しています。

strlen関数

strlen関数は、文字列の長さを取得するための関数です。

終端のヌル文字は含まれません。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    size_t length = strlen(str); // 文字列の長さを取得
    printf("文字列の長さ: %zu\n", length);
    return 0;
}
文字列の長さ: 13

この例では、strの長さを取得しています。

strcmp関数

strcmp関数は、2つの文字列を比較するための関数です。

文字列が等しい場合は0を返し、異なる場合は正または負の値を返します。

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    int result = strcmp(str1, str2); // str1とstr2を比較
    if (result == 0) {
        printf("文字列は等しいです。\n");
    } else {
        printf("文字列は異なります。\n");
    }
    return 0;
}
文字列は異なります。

この例では、str1str2を比較し、異なることを確認しています。

strchr関数とstrrchr関数

strchr関数は、文字列内で指定した文字を最初に見つけた位置を返します。

一方、strrchr関数は、指定した文字を最後に見つけた位置を返します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    char *first = strchr(str, 'o'); // 'o'を最初に見つける
    char *last = strrchr(str, 'o'); // 'o'を最後に見つける
    printf("最初の'o'の位置: %ld\n", first - str);
    printf("最後の'o'の位置: %ld\n", last - str);
    return 0;
}
最初の'o'の位置: 4
最後の'o'の位置: 8

この例では、str内の’o’の最初と最後の位置を取得しています。

strstr関数

strstr関数は、文字列内で指定した部分文字列を最初に見つけた位置を返します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    char *substr = strstr(str, "World"); // "World"を見つける
    if (substr != NULL) {
        printf("部分文字列の位置: %ld\n", substr - str);
    } else {
        printf("部分文字列は見つかりませんでした。\n");
    }
    return 0;
}
部分文字列の位置: 7

この例では、str内の”World”の位置を取得しています。

メモリ操作関数

C言語では、動的メモリ管理を行うための関数が用意されています。

これらの関数を使用することで、プログラムの実行時に必要なメモリを効率的に管理することができます。

malloc関数とfree関数

malloc関数は、指定したバイト数のメモリを動的に確保するための関数です。

確保したメモリは、free関数を使って解放する必要があります。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *array;
    int n = 5;
    array = (int *)malloc(n * sizeof(int)); // n個のint型メモリを確保
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        array[i] = i * 10;
        printf("array[%d] = %d\n", i, array[i]);
    }
    free(array); // 確保したメモリを解放
    return 0;
}
array[0] = 0
array[1] = 10
array[2] = 20
array[3] = 30
array[4] = 40

この例では、malloc関数を使って整数型の配列を動的に確保し、free関数で解放しています。

calloc関数

calloc関数は、指定した要素数とサイズのメモリを確保し、すべてのビットをゼロに初期化します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *array;
    int n = 5;
    array = (int *)calloc(n, sizeof(int)); // n個のint型メモリをゼロ初期化して確保
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    free(array); // 確保したメモリを解放
    return 0;
}
array[0] = 0
array[1] = 0
array[2] = 0
array[3] = 0
array[4] = 0

この例では、calloc関数を使ってゼロ初期化された整数型の配列を確保しています。

realloc関数

realloc関数は、既に確保されたメモリブロックのサイズを変更するための関数です。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int *array;
    int n = 5;
    array = (int *)malloc(n * sizeof(int)); // 初期メモリ確保
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        array[i] = i * 10;
    }
    n = 10;
    array = (int *)realloc(array, n * sizeof(int)); // メモリサイズを変更
    if (array == NULL) {
        printf("メモリの再確保に失敗しました。\n");
        return 1;
    }
    for (int i = 5; i < n; i++) {
        array[i] = i * 10;
    }
    for (int i = 0; i < n; i++) {
        printf("array[%d] = %d\n", i, array[i]);
    }
    free(array); // 確保したメモリを解放
    return 0;
}
array[0] = 0
array[1] = 10
array[2] = 20
array[3] = 30
array[4] = 40
array[5] = 50
array[6] = 60
array[7] = 70
array[8] = 80
array[9] = 90

この例では、realloc関数を使って配列のサイズを拡張しています。

memcpy関数

memcpy関数は、メモリ領域を別のメモリ領域にコピーするための関数です。

重複しないメモリ領域のコピーに適しています。

#include <stdio.h>
#include <string.h>
int main() {
    char source[] = "Hello, World!";
    char destination[50];
    memcpy(destination, source, strlen(source) + 1); // sourceをdestinationにコピー
    printf("コピーされた文字列: %s\n", destination);
    return 0;
}
コピーされた文字列: Hello, World!

この例では、memcpy関数を使って文字列をコピーしています。

memmove関数

memmove関数は、重複する可能性のあるメモリ領域を安全にコピーするための関数です。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    memmove(str + 7, str, 5); // "Hello"を"World"の位置に移動
    printf("移動後の文字列: %s\n", str);
    return 0;
}
移動後の文字列: Hello, Hello!

この例では、memmove関数を使って重複するメモリ領域を安全に移動しています。

memset関数

memset関数は、メモリ領域を特定の値で埋めるための関数です。

#include <stdio.h>
#include <string.h>
int main() {
    char buffer[50];
    memset(buffer, '*', sizeof(buffer) - 1); // バッファを'*'で埋める
    buffer[49] = '
#include <stdio.h>
#include <string.h>
int main() {
    char buffer[50];
    memset(buffer, '*', sizeof(buffer) - 1); // バッファを'*'で埋める
    buffer[49] = '\0'; // 終端文字を追加
    printf("埋められたバッファ: %s\n", buffer);
    return 0;
}
'; // 終端文字を追加 printf("埋められたバッファ: %s\n", buffer); return 0; }
埋められたバッファ: *************************************************

この例では、memset関数を使ってバッファを’*’で埋めています。

数学関数

C言語には、数学的な計算を行うための様々な関数が用意されています。

これらの関数を使用することで、数値の絶対値、べき乗、平方根、三角関数、対数などの計算を簡単に行うことができます。

abs関数

abs関数は、整数の絶対値を計算するための関数です。

負の数を正の数に変換します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int value = -10;
    int absoluteValue = abs(value); // 絶対値を計算
    printf("絶対値: %d\n", absoluteValue);
    return 0;
}
絶対値: 10

この例では、valueの絶対値を計算しています。

pow関数

pow関数は、べき乗を計算するための関数です。

指定した基数を指定した指数で累乗します。

#include <stdio.h>
#include <math.h>
int main() {
    double base = 2.0;
    double exponent = 3.0;
    double result = pow(base, exponent); // 2の3乗を計算
    printf("べき乗の結果: %.2f\n", result);
    return 0;
}
べき乗の結果: 8.00

この例では、baseexponentで累乗した結果を計算しています。

sqrt関数

sqrt関数は、平方根を計算するための関数です。

非負の数の平方根を求めます。

#include <stdio.h>
#include <math.h>
int main() {
    double number = 16.0;
    double squareRoot = sqrt(number); // 平方根を計算
    printf("平方根: %.2f\n", squareRoot);
    return 0;
}
平方根: 4.00

この例では、numberの平方根を計算しています。

sin関数とcos関数

sin関数cos関数は、それぞれ正弦と余弦を計算するための関数です。

角度はラジアンで指定します。

#include <stdio.h>
#include <math.h>
int main() {
    double angle = M_PI / 4; // 45度をラジアンに変換
    double sineValue = sin(angle); // 正弦を計算
    double cosineValue = cos(angle); // 余弦を計算
    printf("sin(45度): %.2f\n", sineValue);
    printf("cos(45度): %.2f\n", cosineValue);
    return 0;
}
sin(45度): 0.71
cos(45度): 0.71

この例では、45度の正弦と余弦を計算しています。

tan関数

tan関数は、正接を計算するための関数です。

角度はラジアンで指定します。

#include <stdio.h>
#include <math.h>
int main() {
    double angle = M_PI / 4; // 45度をラジアンに変換
    double tangentValue = tan(angle); // 正接を計算
    printf("tan(45度): %.2f\n", tangentValue);
    return 0;
}
tan(45度): 1.00

この例では、45度の正接を計算しています。

log関数とexp関数

log関数は、自然対数を計算するための関数です。

一方、exp関数は、eのべき乗を計算するための関数です。

#include <stdio.h>
#include <math.h>
int main() {
    double number = 2.71828; // eに近い値
    double naturalLog = log(number); // 自然対数を計算
    double exponentValue = exp(1.0); // eの1乗を計算
    printf("自然対数: %.2f\n", naturalLog);
    printf("eの1乗: %.2f\n", exponentValue);
    return 0;
}
自然対数: 1.00
eの1乗: 2.72

この例では、numberの自然対数とeの1乗を計算しています。

ファイル操作関数

C言語では、ファイルを操作するための様々な関数が用意されています。

これらの関数を使用することで、ファイルの読み書きや位置の移動、エラーの検出などを行うことができます。

fopen関数とfclose関数

fopen関数は、ファイルを開くための関数です。

ファイルを開いた後は、fclose関数を使ってファイルを閉じる必要があります。

#include <stdio.h>
int main() {
    FILE *file;
    file = fopen("example.txt", "w"); // ファイルを開く(書き込みモード)
    if (file == NULL) {
        printf("ファイルを開くことができませんでした。\n");
        return 1;
    }
    fprintf(file, "こんにちは、ファイル!\n"); // ファイルに書き込む
    fclose(file); // ファイルを閉じる
    return 0;
}
ファイル "example.txt" に "こんにちは、ファイル!" が書き込まれます。

この例では、example.txtというファイルを開き、文字列を書き込んでから閉じています。

fread関数とfwrite関数

fread関数fwrite関数は、バイナリデータをファイルから読み込んだり、ファイルに書き込んだりするための関数です。

#include <stdio.h>
int main() {
    FILE *file;
    int numbers[5] = {1, 2, 3, 4, 5};
    int readNumbers[5];
    file = fopen("numbers.bin", "wb"); // バイナリファイルを開く(書き込みモード)
    fwrite(numbers, sizeof(int), 5, file); // 配列をファイルに書き込む
    fclose(file);
    file = fopen("numbers.bin", "rb"); // バイナリファイルを開く(読み込みモード)
    fread(readNumbers, sizeof(int), 5, file); // ファイルから配列を読み込む
    fclose(file);
    for (int i = 0; i < 5; i++) {
        printf("readNumbers[%d] = %d\n", i, readNumbers[i]);
    }
    return 0;
}
readNumbers[0] = 1
readNumbers[1] = 2
readNumbers[2] = 3
readNumbers[3] = 4
readNumbers[4] = 5

この例では、整数の配列をバイナリファイルに書き込み、再度読み込んで表示しています。

fprintf関数とfscanf関数

fprintf関数fscanf関数は、テキストデータをフォーマットしてファイルに書き込んだり、ファイルから読み込んだりするための関数です。

#include <stdio.h>
int main() {
    FILE *file;
    int number;
    char name[50];
    file = fopen("data.txt", "w"); // テキストファイルを開く(書き込みモード)
    fprintf(file, "%d %s\n", 25, "Taro"); // データをファイルに書き込む
    fclose(file);
    file = fopen("data.txt", "r"); // テキストファイルを開く(読み込みモード)
    fscanf(file, "%d %s", &number, name); // ファイルからデータを読み込む
    fclose(file);
    printf("読み込んだデータ: %d, %s\n", number, name);
    return 0;
}
読み込んだデータ: 25, Taro

この例では、整数と文字列をテキストファイルに書き込み、再度読み込んで表示しています。

fseek関数とftell関数

fseek関数は、ファイル内の位置を移動するための関数です。

ftell関数は、現在のファイル位置を取得するための関数です。

#include <stdio.h>
int main() {
    FILE *file;
    long position;
    file = fopen("example.txt", "r"); // ファイルを開く(読み込みモード)
    if (file == NULL) {
        printf("ファイルを開くことができませんでした。\n");
        return 1;
    }
    fseek(file, 0, SEEK_END); // ファイルの終端に移動
    position = ftell(file); // 現在の位置を取得
    printf("ファイルサイズ: %ld バイト\n", position);
    fclose(file);
    return 0;
}
ファイルサイズ: 18 バイト

この例では、ファイルの終端に移動してファイルサイズを取得しています。

feof関数とferror関数

feof関数は、ファイルの終端に達したかどうかを確認するための関数です。

ferror関数は、ファイル操作中にエラーが発生したかどうかを確認するための関数です。

#include <stdio.h>
int main() {
    FILE *file;
    char ch;
    file = fopen("example.txt", "r"); // ファイルを開く(読み込みモード)
    if (file == NULL) {
        printf("ファイルを開くことができませんでした。\n");
        return 1;
    }
    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }
    if (feof(file)) {
        printf("\nファイルの終端に達しました。\n");
    }
    if (ferror(file)) {
        printf("ファイル読み込み中にエラーが発生しました。\n");
    }
    fclose(file);
    return 0;
}
ファイルの内容が表示され、終端に達したことが示されます。

この例では、ファイルの内容を読み込み、終端に達したことを確認しています。

時間関連関数

C言語には、時間を扱うための様々な関数が用意されています。

これらの関数を使用することで、現在の時刻の取得や時間の差の計算、時間のフォーマットなどを行うことができます。

time関数

time関数は、現在のカレンダー時刻を取得するための関数です。

取得した時刻は、time_t型で表されます。

#include <stdio.h>
#include <time.h>
int main() {
    time_t currentTime;
    currentTime = time(NULL); // 現在の時刻を取得
    printf("現在の時刻: %ld\n", currentTime);
    return 0;
}
現在の時刻: 1633072800

この例では、time関数を使って現在の時刻を取得し、time_t型の値として表示しています。

clock関数

clock関数は、プログラムの実行時間を計測するための関数です。

プロセッサ時間をクロック単位で返します。

#include <stdio.h>
#include <time.h>
int main() {
    clock_t start, end;
    double cpu_time_used;
    start = clock(); // 計測開始
    // 何らかの処理
    for (volatile long i = 0; i < 100000000; i++);
    end = clock(); // 計測終了
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("処理時間: %f 秒\n", cpu_time_used);
    return 0;
}
処理時間: 0.123456 秒

この例では、clock関数を使ってプログラムの実行時間を計測しています。

difftime関数

difftime関数は、2つの時刻の差を秒単位で計算するための関数です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t start, end;
    double difference;
    start = time(NULL); // 開始時刻を取得
    // 何らかの処理
    for (volatile long i = 0; i < 100000000; i++);
    end = time(NULL); // 終了時刻を取得
    difference = difftime(end, start); // 時刻の差を計算
    printf("経過時間: %.f 秒\n", difference);
    return 0;
}
経過時間: 2 秒

この例では、difftime関数を使って2つの時刻の差を計算しています。

mktime関数

mktime関数は、struct tm構造体をカレンダー時刻に変換するための関数です。

#include <stdio.h>
#include <time.h>
int main() {
    struct tm timeinfo = {0};
    timeinfo.tm_year = 2021 - 1900; // 年は1900年からのオフセット
    timeinfo.tm_mon = 9 - 1; // 月は0から11
    timeinfo.tm_mday = 30;
    time_t calendarTime = mktime(&timeinfo); // カレンダー時刻に変換
    printf("カレンダー時刻: %ld\n", calendarTime);
    return 0;
}
カレンダー時刻: 1632960000

この例では、mktime関数を使ってstruct tmをカレンダー時刻に変換しています。

strftime関数

strftime関数は、struct tm構造体をフォーマットされた文字列に変換するための関数です。

#include <stdio.h>
#include <time.h>
int main() {
    time_t currentTime;
    struct tm *timeinfo;
    char buffer[80];
    time(¤tTime);
    timeinfo = localtime(¤tTime);
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo); // フォーマットされた文字列に変換
    printf("フォーマットされた時刻: %s\n", buffer);
    return 0;
}
フォーマットされた時刻: 2021-09-30 12:34:56

この例では、strftime関数を使って現在の時刻をフォーマットされた文字列に変換しています。

応用例

C言語の基本的な関数を組み合わせることで、様々な応用プログラムを作成することができます。

ここでは、いくつかの応用例を紹介します。

ファイルのコピーを行うプログラム

このプログラムは、指定されたファイルを別のファイルにコピーします。

fopenfreadfwrite関数を使用します。

#include <stdio.h>
int main() {
    FILE *sourceFile, *destFile;
    char buffer[1024];
    size_t bytesRead;
    sourceFile = fopen("source.txt", "rb");
    if (sourceFile == NULL) {
        printf("ソースファイルを開くことができませんでした。\n");
        return 1;
    }
    destFile = fopen("destination.txt", "wb");
    if (destFile == NULL) {
        printf("宛先ファイルを開くことができませんでした。\n");
        fclose(sourceFile);
        return 1;
    }
    while ((bytesRead = fread(buffer, 1, sizeof(buffer), sourceFile)) > 0) {
        fwrite(buffer, 1, bytesRead, destFile);
    }
    fclose(sourceFile);
    fclose(destFile);
    printf("ファイルのコピーが完了しました。\n");
    return 0;
}

このプログラムは、source.txtの内容をdestination.txtにコピーします。

バッファを使用して効率的にデータを転送します。

文字列の逆順表示プログラム

このプログラムは、入力された文字列を逆順に表示します。

strlen関数を使用して文字列の長さを取得します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[100];
    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin);
    size_t length = strlen(str);
    if (str[length - 1] == '\n') {
        str[length - 1] = '
#include <stdio.h>
#include <string.h>
int main() {
    char str[100];
    printf("文字列を入力してください: ");
    fgets(str, sizeof(str), stdin);
    size_t length = strlen(str);
    if (str[length - 1] == '\n') {
        str[length - 1] = '\0'; // 改行を削除
        length--;
    }
    printf("逆順の文字列: ");
    for (int i = length - 1; i >= 0; i--) {
        putchar(str[i]);
    }
    printf("\n");
    return 0;
}
'; // 改行を削除 length--; } printf("逆順の文字列: "); for (int i = length - 1; i >= 0; i--) { putchar(str[i]); } printf("\n"); return 0; }

このプログラムは、ユーザーから入力された文字列を逆順に表示します。

メモリ効率を考慮したデータ処理

このプログラムは、動的メモリを使用して整数の配列を処理します。

mallocfree関数を使用します。

#include <stdio.h>
#include <stdlib.h>
int main() {
    int n;
    printf("配列のサイズを入力してください: ");
    scanf("%d", &n);
    int *array = (int *)malloc(n * sizeof(int));
    if (array == NULL) {
        printf("メモリの確保に失敗しました。\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        array[i] = i * 2;
    }
    printf("配列の内容: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    free(array);
    return 0;
}

このプログラムは、ユーザーが指定したサイズの整数配列を動的に確保し、処理を行います。

数学関数を用いたグラフ描画

このプログラムは、数学関数を使用して簡単なグラフを描画します。

sin関数を使用します。

#include <stdio.h>
#include <math.h>
int main() {
    for (int i = 0; i < 360; i += 10) {
        double radians = i * M_PI / 180.0;
        double value = sin(radians);
        int offset = (int)((value + 1) * 10); // -1から1を0から20に変換
        printf("%3d: ", i);
        for (int j = 0; j < offset; j++) {
            putchar(' ');
        }
        printf("*\n");
    }
    return 0;
}

このプログラムは、0度から360度までの正弦波を簡単なテキストグラフとして描画します。

時間計測を用いたパフォーマンス分析

このプログラムは、clock関数を使用して特定の処理の実行時間を計測します。

#include <stdio.h>
#include <time.h>
int main() {
    clock_t start, end;
    double cpu_time_used;
    start = clock(); // 計測開始
    // 何らかの処理
    for (volatile long i = 0; i < 100000000; i++);
    end = clock(); // 計測終了
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("処理時間: %f 秒\n", cpu_time_used);
    return 0;
}

このプログラムは、ループ処理の実行時間を計測し、パフォーマンスを分析します。

よくある質問

printf関数で数値をフォーマットするにはどうすればいいですか?

printf関数を使用して数値をフォーマットするには、フォーマット指定子を使用します。

例えば、整数を表示するには%d、浮動小数点数を表示するには%fを使用します。

小数点以下の桁数を指定する場合は、%.2fのように記述します。

例:printf("数値: %.2f\n", 3.14159);は「数値: 3.14」と表示します。

malloc関数で確保したメモリを解放しないとどうなりますか?

malloc関数で確保したメモリを解放しないと、メモリリークが発生します。

メモリリークは、プログラムが終了するまでメモリが解放されないため、システムのメモリ資源を無駄に消費します。

長時間動作するプログラムでは、メモリリークが蓄積するとシステムのパフォーマンスが低下し、最悪の場合、メモリ不足でプログラムがクラッシュすることがあります。

ファイル操作でエラーが発生した場合の対処法は?

ファイル操作でエラーが発生した場合は、エラーチェックを行い、適切な対処をすることが重要です。

fopen関数の戻り値を確認し、NULLであればファイルのオープンに失敗しています。

ferror関数を使用して、ファイルストリームにエラーが発生しているかを確認できます。

エラーが発生した場合は、エラーメッセージを表示し、必要に応じてプログラムを終了するか、再試行するロジックを実装します。

まとめ

C言語の基本的な関数を理解し、適切に使用することで、様々なプログラムを効率的に作成することができます。

この記事では、標準入出力、文字列操作、メモリ管理、数学計算、ファイル操作、時間管理の各関数について解説しました。

これらの知識を活用して、より複雑なプログラムを作成し、C言語のスキルを向上させましょう。

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