C 言語の文字列をマスター: 宣言、入力、出力、ライブラリ関数
C 言語における文字列とは?
C における 文字列 は、ヌル文字 (\0) で終端される連続した文字のシーケンスです。言語に専用の文字列型はありませんが、通常は char 型の配列として表現されます。文字列リテラルで初期化する際、コンパイラは自動的にヌル終端文字を追加します。
"Welcome to the world of programming!"
標準ライブラリヘッダー <string.h> には、文字列を効率的に操作するための豊富な関数が用意されています。
文字列の宣言と初期化
C は文字列を文字配列として扱うため、配列サイズを指定する必要があります。サイズはヌル終端文字を除く最大文字数を定義します。
char string_variable_name[array_size];
典型的な宣言:
char first_name[15]; /* 最大 14 文字 + \0 */ char last_name[15];
初期化子を与えると、コンパイラが文字数を数えて自動的にヌル終端文字を追加します。初期化子がある場合は配列サイズを省略可能です。
char first_name[15] = "ANTHONY";
char first_name[] = "NATHAN"; /* サイズ推論 */
char string3[6] = {'h','e','l','l','o','\0'}; /* 明示的終端 */
ユーザーからの文字列入力
入力関数は安全性と振る舞いが異なります:
scanf("%s", name)– 空白まで読み取るがバッファオーバーフローの脆弱性あり。gets()– 1 行全体を読み取るが危険で C11 で削除済み。fgets(name, size, stdin)– 最大size-1文字を読み取り、ヌル終端文字分の余白を残す。
fgets 使用例:
#include <stdio.h>
int main() {
char name[50];
printf("Enter your full name: ");
fgets(name, sizeof(name), stdin);
printf("Your name is %s", name);
return 0;
}
文字列の出力
文字列表示の古典的方法は printf("%s", name);。便利な代替手段:
fputs(name, stdout)– 出力ストリームに直接書き込み。puts(name)– 文字列に改行を付けて出力。
puts 例:
#include <stdio.h>
int main() {
char greeting[] = "Hello, world!";
puts(greeting);
return 0;
}
文字列ライブラリ (<string.h>)
よく使用される関数:
| 関数 | 説明 |
|---|---|
| strlen | 文字列の長さを返す (ヌル終端文字除く)。 |
| strcat | ある文字列を別の文字列に連結。 |
| strcmp | 2 つの文字列を辞書順で比較。 |
| strcpy | 文字列をコピー。 |
| strncmp | 最大 n 文字まで比較。 |
| strncpy | 最大 n 文字までコピー。 |
| strchr | 文字の最初の出現位置を検索。 |
| strrchr | 文字の最後の出現位置を検索。 |
| strstr | 部分文字列を検索。 |
| strncat | 最大 n 文字まで連結。 |
| strlwr | 小文字に変換 (非標準)。 |
| strupr | 大文字に変換 (非標準)。 |
| strrev | 文字列を反転 (非標準)。 |
説明用プログラム:
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = " World!";
char result[40];
/* 比較 */
if (strcmp(str1, str2) == 0) puts("Strings are equal");
else puts("Strings are not equal");
/* 連結 */
strcat(str1, str2); // str1 は "Hello World!" に
printf("Concatenated: %s\n", str1);
/* 長さ */
printf("Length of str1: %zu\n", strlen(str1));
/* コピー */
strcpy(result, str1);
printf("Copied string: %s\n", result);
return 0;
}
文字列から数値への変換
標準変換関数:
atoi–intに変換。atof–doubleに変換。atol–longに変換。
atoi 例:
#include <stdio.h>
#include <stdlib.h>
int main() {
char number_str[20];
printf("Enter a number: ");
fgets(number_str, sizeof(number_str), stdin);
int num = atoi(number_str);
printf("You entered %d\n", num);
return 0;
}
重要なポイント
- 文字列は \0 で終端される
char配列に格納される文字シーケンス。 - 使用前に配列サイズを宣言、または初期化時にコンパイラに推論させる。
- 安全な入力には
fgetsを使用。getsと境界チェックなしのscanf("%s")は避ける。 <string.h>を活用して堅牢な文字列操作を行う。- 文字列数値は
atoi、atof、atolで変換し、実行時エラーを防ぐ。 - 文字列リテラルは読み取り専用。変更すると未定義動作の原因。
C言語
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- C++文字列関数をマスター:strcpy、strcat、strlen、strcmpの実践例
- C言語のrealloc()活用ガイド:構文、ベストプラクティス、実例
- C言語free()関数完全マスター:実践ガイドと例
- C#の文字列操作:Stringクラスのプロパティ・メソッド・ベストプラクティス
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- Python文字列操作マスター:replace、join、split、reverse、大文字小文字変換
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Java Enumの文字列表現マスター:デフォルト、オーバーライド、高度なパターン
- Java String.length()メソッド:文字列サイズ取得の実例解説
- Java Stringクラス完全ガイド:生成、操作、主要メソッド46選