Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
ポインタと文字列
C言語の文字列は『char』型の配列で表現され、末尾にヌル文字('\0')が置かれます。文字列を扱う際は『char *』ポインタを介することが多く、文字列操作のための標準関数は『<string.h>』に含まれています。
構文
// char 配列として文字列を宣言します(変更可能)。 char str[20] = "Hello"; char str[] = "Hello"; // サイズを自動決定します(ヌル文字込みで6バイト)。 // 文字列リテラルへのポインタを宣言します(変更不可)。 const char *p = "Hello"; // 文字列の主な標準関数です(#include <string.h> が必要)。 strlen(str) // 文字列の長さを返します(ヌル文字を除く)。 strcpy(dest, src) // 文字列をコピーします。 strncpy(dest, src, n) // 最大 n 文字コピーします。 strcat(dest, src) // 文字列を連結します。 strcmp(str1, str2) // 文字列を比較します。 strchr(str, ch) // 文字を検索してアドレスを返します。 strstr(str, sub) // 部分文字列を検索してアドレスを返します。
主な文字列操作関数一覧
| 関数 | 概要 |
|---|---|
| strlen(s) | ヌル文字を除いた文字列の長さを返します。 |
| strcpy(dest, src) | srcの文字列をdestにコピーします。destのバッファが十分に大きい必要があります。 |
| strncpy(dest, src, n) | srcから最大n文字をdestにコピーします。バッファオーバーフロー対策として推奨されます。 |
| strcat(dest, src) | destの末尾にsrcを連結します。destには結合後の文字列が入るだけの領域が必要です。 |
| strcmp(s1, s2) | 2つの文字列を比較します。等しければ0、s1が小さければ負、大きければ正を返します。 |
| strchr(s, c) | 文字列の中から文字cを最初に見つけた位置へのポインタを返します。見つからない場合はNULLを返します。 |
| strstr(s, sub) | 文字列中から部分文字列subを最初に見つけた位置へのポインタを返します。 |
サンプルコード
#include <stdio.h>
#include <string.h>
int main(void) {
// char 配列の文字列は変更できます。
char greeting[20] = "Hello";
greeting[0] = 'h'; // 1文字目を書き換えます。
printf("%s\n", greeting); // 『hello』と出力されます。
// const char * は文字列リテラルへのポインタです(変更不可)。
const char *lang = "C language";
printf("%s\n", lang);
// 文字列の長さを調べます。
printf("長さ: %zu\n", strlen(greeting)); // 『長さ: 5』と出力されます。
// 文字列をコピーします。
char copy[20];
strncpy(copy, greeting, sizeof(copy) - 1);
copy[sizeof(copy) - 1] = '\0'; // 安全のため末尾にヌル文字を付けます。
printf("コピー: %s\n", copy); // 『コピー: hello』と出力されます。
// 文字列を比較します(==では比較できません)。
char s1[] = "apple";
char s2[] = "apple";
if (strcmp(s1, s2) == 0) {
printf("文字列は等しいです。\n");
}
// 文字を検索します。
char sentence[] = "Hello, World!";
char *found = strchr(sentence, 'W');
if (found != NULL) {
printf("'W' の位置: %s\n", found); // 『World!』と出力されます。
}
// ポインタを使って1文字ずつ操作します。
char *p = sentence;
int vowels = 0;
while (*p != '\0') {
if (*p == 'a' || *p == 'e' || *p == 'i' || *p == 'o' || *p == 'u') {
vowels++;
}
p++;
}
printf("母音の数: %d\n", vowels);
return 0;
}
概要
C言語には文字列型がなく、すべて『char』配列とヌル文字で実現されています。文字列の比較に『==』を使うとアドレスの比較になってしまいます。文字列の内容を比較するには必ず『strcmp()』を使用してください。
『strcpy()』や『strcat()』はバッファの大きさをチェックしないため、コピー先が小さいとバッファオーバーフローが発生します。セキュリティ上の理由から、サイズ指定付きの『strncpy()』や『strncat()』を使う習慣をつけることを推奨します。
文字列の入力には『fgets()』が安全です。printf/scanf系の書式指定については『printf() / fprintf()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。