ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

C言語について特徴などをまとめてみる

C言語の勉強でもしてみようと思い特徴などをまとめてみました。

特徴

低レベル操作

  • ハードウェアに近い操作が可能で、メモリ管理(ポインタ操作)やビット操作など、システムレベルのプログラミングに適している。

パフォーマンス

  • コンパイル言語であり、実行速度が速く、リソースが限られた環境(組み込みシステムなど)での利用に適している。

移植性

  • 標準ライブラリが豊富で、異なるプラットフォーム間での移植が比較的容易らしい。

システムプログラミング

  • OS(カーネルやデバイスドライバ)やファームウェアの開発に広く使用されている。

シンプルで軽量

  • 言語仕様がシンプルで、学習しやすく、コンパイラも軽量そう。

歴史と実績

  • 多くの既存システムやライブラリがC言語で書かれてる。

サンプル(2つの数値を入力し和を計算)

2つの数値を入力させ、その和を計算する処理を以下に記述します。

バリデーションなし

プログラム
#include <stdio.h>

int main() {
    int num1, num2, sum;

    // ユーザーに2つの数値を入力させる
    printf("1つ目の数値を入力してください: ");
    scanf("%d", &num1);

    printf("2つ目の数値を入力してください: ");
    scanf("%d", &num2);

    // 和を計算
    sum = num1 + num2;

    // 結果を表示
    printf("2つの数値の和は: %d\n", sum);

    return 0;
}
コンパイル & 実行
gcc -o hoge hoge.c
./hoge
1つ目の数値を入力してください: 1
2つ目の数値を入力してください: 2
2つの数値の和は: 3

./hoge
1つ目の数値を入力してください: 1.1
2つ目の数値を入力してください: 2つの数値の和は: 32760

小数点や数字以外を入力すると、おかしい...

バリデーションあり

プログラム
#include <stdio.h>
#include <stdlib.h> // for strtol
#include <ctype.h>  // for isspace

// 入力バッファをクリアする関数
void clearInputBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF); // 改行またはEOFまで読み飛ばす
}

// 整数入力を安全に取得する関数
int getValidInteger(const char *prompt) {
    char input[100]; // 入力バッファ
    long value;      // 変換後の値
    char *endPtr;    // 変換終了位置

    while (1) {
        printf("%s", prompt);
        if (fgets(input, sizeof(input), stdin) != NULL) {
            // 入力された文字列をlong型に変換
            value = strtol(input, &endPtr, 10);

            // 変換が成功し、かつ余分な文字がないかチェック
            if (endPtr == input) {
                printf("エラー: 入力がありません。整数を入力してください。\n");
            } else if (*endPtr != '\n' && !isspace(*endPtr)) {
                printf("エラー: 不正な入力です。整数を入力してください。\n");
            } else {
                return (int)value; // 正常な整数を返す
            }
        } else {
            printf("エラー: 入力の読み取りに失敗しました。\n");
            clearInputBuffer(); // 入力バッファをクリア
        }
    }
}

int main() {
    int num1, num2, sum;

    // 1つ目の数値を取得
    num1 = getValidInteger("1つ目の数値を入力してください: ");

    // 2つ目の数値を取得
    num2 = getValidInteger("2つ目の数値を入力してください: ");

    // 和を計算
    sum = num1 + num2;

    // 結果を表示
    printf("2つの数値の和は: %d\n", sum);

    return 0;
}
コンパイル & 実行
 ./foo 
1つ目の数値を入力してください: 1.1
エラー: 不正な入力です。整数を入力してください。
1つ目の数値を入力してください: .1
エラー: 入力がありません。整数を入力してください。
1つ目の数値を入力してください: 1
2つ目の数値を入力してください: 3
2つの数値の和は: 4
メモ
  • fgets と strtol の使用
    • fgets で入力を文字列として読み取り、strtol で整数に変換します。
    • strtol は変換できなかった部分のポインタを返すため、これを使って不正な入力を検出します。
  • isspace
    • 変換後の文字列に余分な空白や改行以外の文字が含まれていないかを確認します。