C言語の文字列(char配列)の扱い方。strcpy, strlen, strcmp等の文字列関数。
char 配列 + 末尾 \0printf("%s", s); で表示strlen, strcpy, strcmp は <string.h>c + ('a'-'A')strcpy は危険、snprintf を使うchar が 1 文字 を入れる箱だと学びました。char の配列 を使えば、複数の文字 = 文字列 が表現できます。char の箱を 7 個 並べて、文字列 "coffee" を表現'\0'(ヌル文字) を置きます。「ここで文字列が終わり」の目印で、これがないと printf がどこまで出力していいか分かりません。
char name[20] = "coffee"; // char の箱を 20 個用意(最大19文字 + '\0') printf("%s\n", name); // → coffee
%s は文字列用の書式指定子(string の s)。配列名だけを渡します(先頭の箱の住所が渡る)。"Hello" がメモリにどう並ぶかを見てみましょう。name は、それ自体が先頭要素のアドレスとして扱われます。だから & を付けなくてもアドレスが渡るのです。
fgets が安全)。
strlen(標準ライブラリ)を使えば簡単ですが、仕組みを知るため「自作版」を見てみましょう。#include <string.h> で使える、文字列操作の主要関数をまとめます。| 関数 | 機能 | 使用例 | 注意点 |
|---|---|---|---|
strlen(s) | 文字列の長さ | strlen("abc") → 3 | '\0' は含まない |
strcpy(dst, src) | 文字列コピー | strcpy(s, "Hello") | dst に十分なサイズが必要 |
strncpy(dst, src, n) | 最大n文字コピー | strncpy(s, src, 10) | バッファオーバーフロー防止 |
strcat(dst, src) | 文字列の連結 | strcat(s, " World") | dst に連結後のサイズが必要 |
strcmp(s1, s2) | 文字列の比較 | strcmp(a, b) == 0 | 0なら等しい、正/負で辞書順 |
strncmp(s1, s2, n) | 先頭n文字を比較 | strncmp(s, "ab", 2) | 部分一致の判定に便利 |
strchr(s, c) | 文字を検索 | strchr(s, 'o') | 見つからなければNULL |
strstr(s, sub) | 部分文字列を検索 | strstr(s, "llo") | 見つからなければNULL |
#include <stdio.h> #include <string.h> int main(void) { char greeting[50]; strcpy(greeting, "Hello"); // greeting = "Hello" strcat(greeting, ", World!"); // greeting = "Hello, World!" printf("%s (%zu文字)\n", greeting, strlen(greeting)); return 0; }
if (s1 == s2) はアドレスの比較であり、文字列の内容は比較されません。strcmp(s1, s2) == 0 を使いましょう。strcpy や strcat は書き込み先のサイズをチェックしません。strncpy で最大文字数を制限しましょう。c + ('a'-'A') を逆方向に使う)strlen を使わずに)この講座の理解度をチェックしましょう!
C言語の文字列は必ずヌル文字 \0 で終端されます。これにより文字列の長さを判別できます。
"Hello" は5文字 + 終端の \0 で合計6バイト必要です。char s[6] 以上が必要です。
strcpy がコピー、strcmp が比較、strlen が長さ取得です。string.h をインクルードして使います。