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
コメント