【C言語】文字列が厄介なので自分なりにまとめた

C言語勉強中のk-oです。私が初めて勉強した言語はphpでした。今の仕事でC言語を使うので勉強しているのですが、phpと比べて思ったことは

文字列の扱いが面倒!

ということ。文字列のプログラムを書いていると結構な頻度で

「あれ?この書き方ってダメなんだっけ・・・?」

となることがあります。何ができて何がダメなのか、しっかり把握したいと思い、この記事を書くことにしました。

定義・初期化

  • 定義はchar型配列で行う
  • 定義と同時に初期化もできる(配列の要素数は文字数よりも多くないといけない)
  • 初期化をする場合は要素数を省略できる
#include <stdio.h>

int main(void)
{
    char str[10];               //char型配列で定義
    char str2[10] = "hello";    //定義と同時に初期化
    char str3[]   = "world";    //初期化をする場合は要素数を省略可

    printf("%s %s\n", str2, str3);
}

出力結果は以下の通り。

hello world

代入不可

c言語を勉強し始めた頃によく勘違いしましたが、文字列は代入ができません
以下はやってはいけない例です。

#include <stdio.h>

int main(void)
{
    char str[10];
    
    str     = "hello";          //代入できない
    str[0]  = "hello";          //これもダメ
    str[10] = "hello";          //これもダメ
}

文字列は代入できないが、一文字ずつなら以下のようにすればできる。
一文字目の要素番号は0、二文字目は1・・・となることに注意

#include <stdio.h>

int main(void)
{
    char str[10];
    
    str[0] = 'x';
    str[1] = 'y';
    str[2] = 'z';
    str[3] = '\0';

    printf("%s\n", str);
}

出力結果は以下の通り。

xyz

一文字ずつ入れる場合、文字列の最後の要素には、’\0′ (ヌル文字)を自分で入れる必要があります。

また、最初の頃はよく間違えましたが、

  • 一文字を扱う・・・シングルクォーテーションで囲む
  • 文字列を扱う・・・ダブルクォーテーションで囲む

という点も注意です。

strcpy(), strncpy()

代入と同じ処理をしたい時はstrcpy()関数を使う。この関数を使う時はstring.hというファイルをインクルードする必要がある。

#include <stdio.h>
#include <string.h>           //これを忘れてはならない

int main(void)
{
    char str1[10];
    char str2[10];
    char str3[] = "world";

    strcpy(str1, "hello");       //str1に文字列helloをコピー
    strcpy(str2, str3);          //str2にstr3をコピー

    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);
}

出力結果は以下の通り。

str1: hello
str2: world

strncpy()関数は、文字列の先頭から指定した文字数分をコピーします。この時に注意すべきなのが、

コピーする文字列の文字数 ≧ 指定した文字数 の時は、最後の要素に自分でヌル文字を加える

ということ。指定した文字数の方が多い場合は、空いてる分ヌル文字を勝手に追加します。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str1[10];
    char str2[10];

    strncpy(str1, "hello", 2);     //str1に文字列heをコピー
    str1[2] = '\0';                //自分で3文字目にヌル文字を入れる
    strncpy(str2, "hello", 6);     //str2に文字列helloをコピー、6文字目にはヌル文字が入る

    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);
}

出力結果は以下の通り。

str1: he
str2: hello

コメント

タイトルとURLをコピーしました