[C言語] 文字・文字列を扱うchar型の使い方を解説

C言語では、文字や文字列を扱うためにchar型を使用します。char型は1バイトのメモリを占有し、ASCIIコードを用いて文字を表現します。

単一の文字を扱う場合はchar型変数を使用し、文字列を扱う場合はchar型の配列を用います。

文字列はヌル文字'\0'で終端されるため、文字列の長さは配列のサイズより1少なくなります。

文字列操作にはstrcpystrlenなどの標準ライブラリ関数が利用されます。

この記事でわかること
  • char型の基本的な特徴とメモリサイズ
  • 文字と文字列のリテラルの定義方法
  • 文字列操作関数の使い方とその応用例
  • 文字列を安全に操作するためのポイント
  • char型とint型の違いとその用途

目次から探す

char型とは

C言語におけるchar型は、文字を扱うための基本的なデータ型です。

char型は、1バイトのメモリを使用して文字を表現します。

これにより、ASCIIコードを用いて文字を扱うことが可能です。

以下では、char型の基本的な特徴やメモリサイズ、符号付きと符号なしの違いについて詳しく解説します。

char型の基本

char型は、C言語で文字を表現するためのデータ型です。

通常、シングルクォートで囲まれた1文字を表現します。

例えば、'A''9'などがchar型の文字リテラルです。

char型は、文字のASCIIコードを整数として扱うことができるため、文字の比較や計算が可能です。

#include <stdio.h>
int main() {
    char letter = 'A'; // 文字'A'をchar型変数letterに代入
    printf("文字: %c, ASCIIコード: %d\n", letter, letter);
    return 0;
}
文字: A, ASCIIコード: 65

この例では、char型変数letterに文字‘A’`を代入し、その文字と対応するASCIIコードを出力しています。

char型のメモリサイズ

char型は、通常1バイト(8ビット)のメモリを使用します。

これは、256通りの異なる値を表現できることを意味します。

C言語の標準では、sizeof(char)は常に1を返します。

これは、char型が最小のデータ単位であることを示しています。

#include <stdio.h>
int main() {
    printf("char型のサイズ: %zuバイト\n", sizeof(char));
    return 0;
}
char型のサイズ: 1バイト

この例では、sizeof演算子を使用してchar型のメモリサイズを出力しています。

char型の符号付きと符号なし

char型には、符号付き(signed char)と符号なし(unsigned char)の2種類があります。

符号付きcharは、負の値を含む範囲を表現でき、通常は-128から127までの範囲を持ちます。

一方、符号なしcharは、0から255までの範囲を持ちます。

スクロールできます
種類範囲
signed char-128 ~ 127
unsigned char0 ~ 255

符号付きと符号なしの選択は、扱うデータの性質に応じて決定します。

例えば、負の値を扱う必要がない場合は、unsigned charを使用することで、より広い正の範囲を利用できます。

文字の扱い

C言語では、文字を扱うためにchar型を使用します。

文字は通常、ASCIIコードを通じて数値として表現されます。

ここでは、文字リテラルの定義方法、文字のASCIIコードの理解、そして文字の入出力について詳しく解説します。

文字リテラルの定義

文字リテラルは、シングルクォートで囲まれた1文字を表現します。

例えば、'A''9'などが文字リテラルです。

文字リテラルは、char型の変数に直接代入することができます。

#include <stdio.h>
int main() {
    char ch = 'A'; // 文字リテラル'A'をchar型変数chに代入
    printf("文字リテラル: %c\n", ch);
    return 0;
}
文字リテラル: A

この例では、char型変数chに文字リテラル‘A’`を代入し、その値を出力しています。

文字のASCIIコード

ASCIIコードは、文字を数値で表現するための標準的な方法です。

char型の変数は、実際にはその文字のASCIIコードを保持しています。

これにより、文字を数値として扱うことが可能です。

#include <stdio.h>
int main() {
    char ch = 'A';
    printf("文字: %c, ASCIIコード: %d\n", ch, ch);
    return 0;
}
文字: A, ASCIIコード: 65

この例では、文字'A'のASCIIコードである65を出力しています。

char型変数を整数として出力することで、対応するASCIIコードを確認できます。

文字の入出力

文字の入出力は、printfscanf関数を使用して行います。

printf関数では、%cフォーマット指定子を使用して文字を出力し、scanf関数では同じく%cを使用して文字を入力します。

#include <stdio.h>
int main() {
    char ch;
    printf("1文字を入力してください: ");
    scanf("%c", &ch); // 文字を入力
    printf("入力された文字: %c\n", ch);
    return 0;
}
1文字を入力してください: B
入力された文字: B

この例では、ユーザーから1文字を入力し、その文字を出力しています。

scanf関数を使用する際は、変数のアドレスを渡すことに注意してください。

文字列の扱い

C言語では、文字列はchar型の配列として扱われます。

文字列は、文字の並びであり、特別な終端文字によって終了を示します。

ここでは、文字列リテラルの定義方法、文字列の配列としての扱い方、そして文字列の終端文字について詳しく解説します。

文字列リテラルの定義

文字列リテラルは、ダブルクォートで囲まれた文字の並びです。

例えば、"Hello""12345"などが文字列リテラルです。

文字列リテラルは、char型の配列に直接代入することができます。

#include <stdio.h>
int main() {
    char greeting[] = "Hello"; // 文字列リテラル"Hello"をchar型配列greetingに代入
    printf("文字列リテラル: %s\n", greeting);
    return 0;
}
文字列リテラル: Hello

この例では、char型配列greetingに文字列リテラル"Hello"を代入し、その値を出力しています。

文字列の配列

文字列は、char型の配列として扱われます。

配列の各要素は、文字列の各文字を表します。

文字列を配列として扱うことで、文字列の各文字にアクセスしたり、変更したりすることが可能です。

#include <stdio.h>
int main() {
    char word[] = "CProgramming";
    printf("最初の文字: %c\n", word[0]); // 配列の最初の要素にアクセス
    word[0] = 'c'; // 最初の文字を小文字に変更
    printf("変更後の文字列: %s\n", word);
    return 0;
}
最初の文字: C
変更後の文字列: cProgramming

この例では、文字列"CProgramming"の最初の文字を小文字に変更し、変更後の文字列を出力しています。

文字列の終端文字

C言語の文字列は、ヌル文字\0で終端されます。

ヌル文字は、文字列の終わりを示す特別な文字であり、文字列の長さを計算する際に重要な役割を果たします。

文字列を操作する際には、この終端文字を考慮する必要があります。

#include <stdio.h>
int main() {
    char name[] = "Alice";
    printf("文字列の長さ: %zu\n", sizeof(name) - 1); // ヌル文字を除いた長さ
    return 0;
}
文字列の長さ: 5

この例では、sizeof演算子を使用して配列のサイズを取得し、ヌル文字を除いた文字列の長さを出力しています。

ヌル文字は、文字列の終端を示すため、文字列の長さには含まれません。

文字列操作関数

C言語には、文字列を操作するための標準ライブラリ関数が多数用意されています。

これらの関数を使用することで、文字列の長さを取得したり、文字列をコピーしたり、結合したり、比較したりすることができます。

ここでは、代表的な文字列操作関数について解説します。

strlen関数で文字列の長さを取得

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

文字列の長さは、ヌル文字を除いた文字数を指します。

strlen関数を使用するには、<string.h>ヘッダファイルをインクルードする必要があります。

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

この例では、strlen関数を使用して文字列"Hello, World!"の長さを取得し、その値を出力しています。

strcpy関数で文字列をコピー

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

コピー先の配列には、コピー元の文字列と同じかそれ以上のサイズが必要です。

strcpy関数を使用するには、<string.h>ヘッダファイルをインクルードする必要があります。

#include <stdio.h>
#include <string.h>
int main() {
    char source[] = "C Programming";
    char destination[20]; // コピー先の配列
    strcpy(destination, source); // 文字列をコピー
    printf("コピーされた文字列: %s\n", destination);
    return 0;
}
コピーされた文字列: C Programming

この例では、strcpy関数を使用して文字列"C Programming"destination配列にコピーし、その結果を出力しています。

strcat関数で文字列を結合

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

結合先の配列には、結合後の文字列を格納するのに十分なサイズが必要です。

strcat関数を使用するには、<string.h>ヘッダファイルをインクルードする必要があります。

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

この例では、strcat関数を使用して文字列"Hello"", World!"を結合し、その結果を出力しています。

strcmp関数で文字列を比較

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

比較結果は、文字列が等しい場合は0、最初の文字列が辞書順で小さい場合は負の値、大きい場合は正の値を返します。

strcmp関数を使用するには、<string.h>ヘッダファイルをインクルードする必要があります。

#include <stdio.h>
#include <string.h>
int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    int result = strcmp(str1, str2); // 文字列を比較
    if (result == 0) {
        printf("文字列は等しい\n");
    } else if (result < 0) {
        printf("'%s'は'%s'より辞書順で小さい\n", str1, str2);
    } else {
        printf("'%s'は'%s'より辞書順で大きい\n", str1, str2);
    }
    return 0;
}
'apple'は'banana'より辞書順で小さい

この例では、strcmp関数を使用して文字列"apple""banana"を比較し、その結果を出力しています。

char型の応用例

char型を用いた文字列操作は、C言語プログラミングにおいて非常に重要です。

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

これらの例を通じて、文字列の逆順表示、部分一致検索、大文字小文字変換の方法を学びましょう。

文字列の逆順表示

文字列を逆順に表示するには、文字列の長さを取得し、末尾から先頭に向かって文字を出力します。

#include <stdio.h>
#include <string.h>
int main() {
    char str[] = "Hello, World!";
    size_t len = strlen(str); // 文字列の長さを取得
    printf("逆順表示: ");
    for (int i = len - 1; i >= 0; i--) {
        printf("%c", str[i]); // 逆順に文字を出力
    }
    printf("\n");
    return 0;
}
逆順表示: !dlroW ,olleH

この例では、strlen関数を使用して文字列の長さを取得し、逆順に文字を出力しています。

文字列の部分一致検索

文字列の中に特定の部分文字列が含まれているかを検索するには、strstr関数を使用します。

この関数は、部分文字列が見つかった場合、その位置を指すポインタを返します。

#include <stdio.h>
#include <string.h>
int main() {
    char text[] = "C programming is fun";
    char keyword[] = "programming";
    char *position = strstr(text, keyword); // 部分文字列を検索
    if (position != NULL) {
        printf("部分文字列'%s'が見つかりました\n", keyword);
    } else {
        printf("部分文字列'%s'は見つかりませんでした\n", keyword);
    }
    return 0;
}
部分文字列'programming'が見つかりました

この例では、strstr関数を使用して文字列"C programming is fun"の中に"programming"が含まれているかを検索し、その結果を出力しています。

文字列の大文字小文字変換

文字列の大文字小文字を変換するには、ctype.hライブラリのtoupperおよびtolower関数を使用します。

これらの関数を用いて、文字列の各文字を変換します。

#include <stdio.h>
#include <ctype.h>
int main() {
    char str[] = "Hello, World!";
    printf("大文字変換: ");
    for (int i = 0; str[i] != '
#include <stdio.h>
#include <ctype.h>
int main() {
    char str[] = "Hello, World!";
    printf("大文字変換: ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c", toupper(str[i])); // 大文字に変換して出力
    }
    printf("\n");
    printf("小文字変換: ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c", tolower(str[i])); // 小文字に変換して出力
    }
    printf("\n");
    return 0;
}
'; i++) { printf("%c", toupper(str[i])); // 大文字に変換して出力 } printf("\n"); printf("小文字変換: "); for (int i = 0; str[i] != '
#include <stdio.h>
#include <ctype.h>
int main() {
    char str[] = "Hello, World!";
    printf("大文字変換: ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c", toupper(str[i])); // 大文字に変換して出力
    }
    printf("\n");
    printf("小文字変換: ");
    for (int i = 0; str[i] != '\0'; i++) {
        printf("%c", tolower(str[i])); // 小文字に変換して出力
    }
    printf("\n");
    return 0;
}
'; i++) { printf("%c", tolower(str[i])); // 小文字に変換して出力 } printf("\n"); return 0; }
大文字変換: HELLO, WORLD!
小文字変換: hello, world!

この例では、toupper関数を使用して文字列を大文字に変換し、tolower関数を使用して小文字に変換しています。

各文字を順に変換して出力することで、文字列全体を変換しています。

よくある質問

char型とint型の違いは?

char型int型は、どちらも整数を扱うデータ型ですが、主に以下の点で異なります。

  • メモリサイズ: char型は通常1バイト(8ビット)で、int型は通常4バイト(32ビット)です(環境によって異なる場合があります)。
  • 用途: char型は主に文字を表現するために使用され、int型は整数を表現するために使用されます。
  • 範囲: char型は-128から127(符号付き)または0から255(符号なし)の範囲を持ちますが、int型はより広い範囲の整数を表現できます。

文字列の長さを取得する方法は?

文字列の長さを取得するには、<string.h>ライブラリのstrlen関数を使用します。

strlen関数は、ヌル文字を除いた文字列の長さを返します。

例:size_t length = strlen("example");

文字列を安全に操作するにはどうすればいい?

文字列を安全に操作するためには、以下の点に注意してください。

  • バッファサイズの確認: コピーや結合を行う際には、バッファサイズが十分であることを確認します。
  • 境界チェック: 配列の境界を超えないように、操作前に必ずチェックを行います。
  • 安全な関数の使用: strncpystrncatなど、サイズを指定できる関数を使用して、バッファオーバーフローを防ぎます。

まとめ

C言語におけるchar型は、文字や文字列を扱うための基本的なデータ型であり、様々な操作が可能です。

この記事では、char型の基本から応用例までを解説し、文字列操作の重要な関数や安全な操作方法についても紹介しました。

これを機に、char型を活用したプログラミングに挑戦し、より高度な文字列操作をマスターしてみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

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