C 言語における文字列を定義して操作する

CBeginner
オンラインで実践に進む

はじめに

この実験では、C プログラミングにおける文字列を作成および操作する方法を学びます。文字列の定義方法、printf を使用してフォーマットする方法、strlen を使用してその長さを決定する方法、および strncmp を使用して比較する方法を探求します。これらの基本的な文字列操作は、堅牢で柔軟な C アプリケーションを構築するために不可欠です。

この実験では、次の手順が扱われます。ポインタ記法を使用した文字列の定義、ローカル配列記法を使用した文字列の定義、printf を使用した文字列のフォーマット、strlen を使用した文字列の長さの決定、および strncmp を使用した文字列の比較。この実験が終了するとき、C 言語における文字列を扱うことについて十分な理解を得ており、独自のプロジェクトでこれらの技術を適用できるようになります。

ポインタ記法を使って文字列を定義する

このステップでは、C 言語でポインタ記法を使って文字列を定義する方法を学びます。ポインタ記法は、C プログラミングにおいて文字列を作成および操作するための柔軟な方法を提供します。

まず、ポインタ記法を使った文字列の定義を示すための新しいファイルを作成しましょう。

cd ~/project
touch string_pointer.c

次に、次のコードを入力します。

#include <stdio.h>

int main() {
    // ポインタ記法を使って文字列を定義する
    char *greeting = "Hello, C Programming!";

    // 文字列を表示する
    printf("Greeting: %s\n", greeting);

    return 0;
}

プログラムをコンパイルして実行します。

gcc string_pointer.c -o string_pointer
./string_pointer

出力例:

Greeting: Hello, C Programming!

コードを解説しましょう。

  • char *greeting は、文字(文字列)へのポインタを宣言します。
  • "Hello, C Programming!" は、メモリに格納された文字列リテラルです。
  • ポインタ greeting は、文字列の最初の文字を指します。
  • printf() は、%s フォーマット指定子を使って、文字列を全体表示します。

また、ポインタを変更して、文字列の異なる部分を指すこともできます。

#include <stdio.h>

int main() {
    char *greeting = "Hello, C Programming!";

    // 文字列の特定の部分を指す
    char *partial = greeting + 7;

    printf("Original string: %s\n", greeting);
    printf("Partial string: %s\n", partial);

    return 0;
}

出力例:

Original string: Hello, C Programming!
Partial string: C Programming!

ローカル配列記法を使って文字列を定義する

このステップでは、C 言語でローカル配列記法を使って文字列を定義する方法を学びます。この方法は、文字配列に対するより直接的な制御で文字列を作成および初期化する別の方法を提供します。

ローカル配列記法を使った文字列の定義を示すための新しいファイルを作成しましょう。

cd ~/project
touch string_array.c

次のコードを入力します。

#include <stdio.h>

int main() {
    // ローカル配列記法を使って文字列を定義する
    char greeting[30] = "Hello, C Programming!";

    // 文字列を表示する
    printf("Greeting: %s\n", greeting);

    return 0;
}

プログラムをコンパイルして実行します。

gcc string_array.c -o string_array
./string_array

出力例:

Greeting: Hello, C Programming!

ローカル配列記法のいくつかのバリエーションを見てみましょう。

#include <stdio.h>

int main() {
    // 明示的な初期化で配列を定義する
    char name[10] = {'J', 'o', 'h', 'n', '\0'};

    // 部分的な初期化で配列を定義する
    char city[20] = "New York";

    // サイズを指定せずに配列を定義する
    char message[] = "Welcome to C Programming!";

    printf("Name: %s\n", name);
    printf("City: %s\n", city);
    printf("Message: %s\n", message);

    return 0;
}

出力例:

Name: John
City: New York
Message: Welcome to C Programming!

ローカル配列記法に関する要点:

  • 配列のサイズを明示的に指定できます。
  • '\0'(null 終端文字)は、文字列の終わりを示すために重要です。
  • 配列は個々の文字で初期化するか、文字列リテラルとして初期化できます。
  • 完全に初期化されていない場合、残りの要素はゼロに設定されます。

printf を使って文字列をフォーマットする

このステップでは、C 言語で printf() を使って文字列をフォーマットし、さまざまなデータ型をフォーマットする方法を学びます。printf() 関数は強力な文字列フォーマット機能を備えています。

文字列フォーマットを示すための新しいファイルを作成しましょう。

cd ~/project
touch string_formatting.c

さまざまなフォーマットオプションを調べるために、次のコードを入力します。

#include <stdio.h>

int main() {
    // 基本的な文字列フォーマット
    char name[] = "Alice";
    int age = 30;
    float height = 5.8;

    // 単純な文字列出力
    printf("Name: %s\n", name);

    // 複数の変数を使ったフォーマット
    printf("Profile: %s is %d years old\n", name, age);

    // 少数点以下の精度を持つ浮動小数点数のフォーマット
    printf("Height: %.1f meters\n", height);

    // 幅と整列
    printf("Name (right-aligned): %10s\n", name);
    printf("Name (left-aligned):  %-10s\n", name);

    // さまざまなフォーマット指定子を混ぜる
    printf("Details: %s, %d years, %.1f meters\n", name, age, height);

    return 0;
}

プログラムをコンパイルして実行します。

gcc string_formatting.c -o string_formatting
./string_formatting

出力例:

Name: Alice
Profile: Alice is 30 years old
Height: 5.8 meters
Name (right-aligned):      Alice
Name (left-aligned): Alice
Details: Alice, 30 years, 5.8 meters

一般的なフォーマット指定子:

  • %s:文字列
  • %d:整数
  • %f:浮動小数点数
  • %.1f:少数点以下 1 桁の浮動小数点数
  • %10s:10 文字幅で右寄せ
  • %-10s:10 文字幅で左寄せ

より高度なフォーマットを調べましょう。

#include <stdio.h>

int main() {
    // 16 進数と 8 進数の表現
    int number = 255;
    printf("Decimal: %d\n", number);
    printf("Hexadecimal: %x\n", number);
    printf("Octal: %o\n", number);

    // ゼロで埋める
    printf("Padded number: %05d\n", 42);

    return 0;
}

出力例:

Decimal: 255
Hexadecimal: ff
Octal: 377
Padded number: 00042

strlen を使って文字列の長さを決定する

このステップでは、C 言語で strlen() 関数を使って文字列の長さを決定する方法を学びます。strlen() 関数は <string.h> ライブラリの一部であり、文字列内の文字数を数える簡単な方法を提供します。

文字列の長さの計算を示すための新しいファイルを作成しましょう。

cd ~/project
touch string_length.c

strlen() を調べるために、次のコードを入力します。

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

int main() {
    // 異なる長さの文字列を定義する
    char greeting[] = "Hello, World!";
    char name[] = "Alice";
    char empty[] = "";

    // 文字列を計算して表示する
    printf("Greeting: %s\n", greeting);
    printf("Greeting length: %lu characters\n", strlen(greeting));

    printf("Name: %s\n", name);
    printf("Name length: %lu characters\n", strlen(name));

    printf("Empty string length: %lu characters\n", strlen(empty));

    return 0;
}

プログラムをコンパイルして実行します。

gcc string_length.c -o string_length
./string_length

出力例:

Greeting: Hello, World!
Greeting length: 13 characters
Name: Alice
Name length: 5 characters
Empty string length: 0 characters

strlen() を使ったもっと実用的な例を見てみましょう。

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

int main() {
    char input[100];

    printf("Enter a string: ");
    fgets(input, sizeof(input), stdin);

    // 改行文字があれば削除する
    input[strcspn(input, "\n")] = 0;

    // 文字列を計算して表示する
    size_t length = strlen(input);

    printf("You entered: %s\n", input);
    printf("String length: %lu characters\n", length);

    // 長さに基づく操作を示す
    if (length > 10) {
        printf("This is a long string!\n");
    } else if (length > 0) {
        printf("This is a short string.\n");
    } else {
        printf("You entered an empty string.\n");
    }

    return 0;
}

strlen() に関する要点:

  • ヌル終端文字の前の文字数を返す
  • ヌル終端文字は数えない
  • 文字配列と文字列リテラルで動作する
  • <string.h> ライブラリの一部なので、このヘッダを含める
  • size_t 型(符号なし long)を返す

strncmp を使って文字列比較を行う

このステップでは、C 言語で strncmp() 関数を使って文字列を比較する方法を学びます。strncmp() 関数を使うと、2 つの文字列間の指定された数の文字を比較できます。

文字列の比較を示すための新しいファイルを作成しましょう。

cd ~/project
touch string_compare.c

strncmp() を調べるために、次のコードを入力します。

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

int main() {
    // 比較用の文字列を定義する
    char str1[] = "Hello, World!";
    char str2[] = "Hello, Everyone!";
    char str3[] = "Hello, World!";

    // 文字列を全体で比較する
    printf("Full string comparison:\n");
    int result1 = strncmp(str1, str2, strlen(str1));
    int result2 = strncmp(str1, str3, strlen(str1));

    printf("str1 vs str2: %d\n", result1);
    printf("str1 vs str3: %d\n", result2);

    // 最初の数文字を比較する
    printf("\nPartial string comparison:\n");
    int result3 = strncmp(str1, str2, 7);
    printf("First 7 characters of str1 vs str2: %d\n", result3);

    return 0;
}

プログラムをコンパイルして実行します。

gcc string_compare.c -o string_compare
./string_compare

出力例:

Full string comparison:
str1 vs str2: -1
str1 vs str3: 0

Partial string comparison:
First 7 characters of str1 vs str2: 0

文字列比較のもっと実用的な例を作成しましょう。

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

int main() {
    // パスワード検証の例
    char stored_password[] = "SecretPass123";
    char input_password[20];

    printf("Enter password: ");
    scanf("%19s", input_password);

    // パスワードの最初の 10 文字を比較する
    int comparison = strncmp(stored_password, input_password, 10);

    if (comparison == 0) {
        printf("Access granted!\n");
    } else {
        printf("Access denied!\n");
    }

    return 0;
}

strncmp() に関する要点:

  • 指定された数の文字まで比較する
  • 指定された長さで文字列が一致する場合は 0 を返す
  • 最初の文字列が辞書順で小さい場合は負の値を返す
  • 最初の文字列が辞書順で大きい場合は正の値を返す
  • <string.h> ライブラリの一部
  • 部分的な文字列比較に便利

strncmp() の戻り値を理解する:

  • 0:指定された長さで文字列が等しい
  • < 0:最初の文字列が 2 番目の文字列の前にある
  • 0:最初の文字列が 2 番目の文字列の後にある

まとめ

この実験では、C プログラミングにおいてポインタ記法とローカル配列記法の両方を使って文字列を定義する方法を学びました。ポインタ記法を使うことで、文字ポインタを使って柔軟に文字列を作成および操作できます。ローカル配列記法を使うことで、文字配列に対するより直接的な制御が可能です。また、printf() を使って文字列をフォーマットし、strlen() を使って文字列の長さを決定し、strncmp() を使って文字列を比較する方法も学びました。これらの文字列操作技術は、C 言語でテキストデータを扱うための基本的なスキルです。