Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語】ポインタを使った文字列操作の基本とサンプルプログラム解説

C言語において、文字(char型)の配列として表現されるデータを文字列と呼びます。文字列の末尾には終端文字「\0」が自動的に配置され、これが文字列の終わりを示す目印となります。

文字列の宣言

文字列(char型配列)を宣言する基本構文は以下のとおりです。

char 文字列名 [サイズ];

たとえば、次のように書くと50文字分の領域を持つ文字列を宣言できます。

char string[50];

文字列の初期化

文字列の初期化には、主に次の2つの方法があります。

① 1文字ずつ文字定数で指定する方法

char string[10] = {'H', 'e', 'l', 'l', 'o', '\0'};

② 文字列定数(文字列リテラル)を使う方法

char string[10] = "Hello";

文字列へのアクセス: printf関数などで文字列を出力する際には、制御文字「%s」を使用します。「%s」は終端文字「\0」に到達するまで文字列を連続的に読み込み・出力します。

続いて、C言語におけるポインタ配列について理解していきましょう。

ポインタ配列(文字列へのポインタの配列)

  • 各要素が、それぞれの文字列の先頭アドレスを指すポインタとなっている配列のことです。
  • 宣言と初期化は次のように行います。
char *a[] = {"one", "two", "three"};

この場合、各要素は次のように対応します。

  • a[0] … 文字列 "one" の先頭アドレスを指すポインタ
  • a[1] … 文字列 "two" の先頭アドレスを指すポインタ
  • a[2] … 文字列 "three" の先頭アドレスを指すポインタ

サンプルプログラム1:文字列とポインタの基本

以下は、文字列の基本的な扱い方を示すCプログラムです。

#include<stdio.h>
#include<string.h>
void main(){
    //文字列とポインタの宣言//
    char *s="Meghana";
    //出力//
    printf("%s\n",s);      //Meghana と表示される//
    printf("%c\n",s);      //%cを使う場合は*が必要。付けないと正しく表示されない//
    printf("%c\n",*s);     //M:先頭アドレスにある文字が表示される//
    printf("%c\n",*(s+4)); //a:先頭アドレス+4番目の位置にある文字(5番目の文字)//
    printf("%c\n",*s+5);   //R:先頭の文字'M'に5を加算したもの(アルファベット順で5つ後)//
}

実行結果

このプログラムを実行すると、次のような出力が得られます。

Meghana
M
a
R

サンプルプログラム2:インクリメント演算子との組み合わせ

次に、前置インクリメント(++s)と後置インクリメント(s++)を使って文字を出力する例を見てみましょう。

#include<stdio.h>
#include<string.h>
void main(){
    //文字列とポインタの宣言//
    char *s="Meghana";
    //出力//
    printf("%s\n",s);      //Meghana と表示される//
    printf("%c\n",++s+3);  //前置インクリメント:sは2番目の位置'e'へ移動。出力は不定値(ガベージ値)//
    printf("%c\n",s+++3);  //後置インクリメント:sは3番目の位置'g'へ移動。出力は不定値(ガベージ値)//
    printf("%c\n",*++s+3); //sがさらに1つ進み'h'を参照。'h'+3='k'が出力される//
    printf("%c\n",*s+++3); //'h'の値に3を加えた'k'が出力され、その後sは1つ進む//
}

実行結果

このプログラムを実行すると、次のような出力が得られます。

Meghana
d
d
k
k

ポイントまとめ

  • 「%s」は文字列全体を、「%c」は1文字だけを出力する変換指定子です。
  • 「*s」はポインタが指す先頭の文字を、「*(s+n)」は先頭からn番目の文字を参照します。
  • 「*s+5」と書くと「参照した文字に5を加える」という意味になり、「*(s+5)」とはまったく異なる動作になる点に注意しましょう。
  • 前置インクリメント(++s)は先にポインタを進めてから使用するのに対し、後置インクリメント(s++)は現在の値を使用してからポインタを進めます。
  1. C言語で文字列へのポインタの配列とそのアドレスを出力する方法

    まずは、C言語における「ポインタの配列」とは何かを確認しましょう。 文字列へのポインタの配列とは 各要素が、文字列の先頭アドレスを指すポインタになっている配列のことです。 宣言と初期化は次のように行います。 char *a[ ] = {"one", "two", "three"}; ここで、a[0] は文字列 one の、a[1] は two の、a[2] は three のそれぞれ先頭アドレスを指すポインタです。 イメージとしては、配列の各要素が対応する文字列の先頭番地を保持しており、その番地をたどることで文字列本体へアクセスで

  2. C言語の条件分岐を完全解説!フローチャートとサンプルプログラムで学ぶ意思決定処理

    C言語における「意思決定(条件分岐)」とは、条件が真(True)か偽(False)かを判定し、その結果に応じて実行する処理を切り替える仕組みです。プログラムに柔軟な制御を持たせるために欠かせない概念であり、以下のような分岐文があります。単純if文(simple – if statement)if–else文ネストしたif–else文else–ifラダーswitch文本記事では、それぞれの構文・フローチャート・サンプルプログラムと実行結果を順番に解説していきます。1. 単純if文(simple – if statement)「if」キーワードは、論理条件が真である場合に、一連のステートメントを実