身につくC言語18回目 文字列の操作 ポインタと文字列の関係

プログラムをするにあたって、多くの場合出力があります。

 

そのほとんどは文字列であらわされます。(光や音声なんてこともありますが)

 

今回はその文字列の扱いについて紹介していきます。

 

文字列の操作

今までは、文字列を入力して出力するというような簡単な操作しかしてきませんでしたが、今回は、「コピー」「追加」「比較」の3つをします。

今までのコード


#include<stdio.h>
int main(void)
{
	char text[20];
	scanf("%s",text);
	printf("%s\n",text);
	return 0;
}

※配列に一気に格納するときは、scanfに&をつける必要はない。

 

文字列をコピーする

text1に”hello”を代入して、text2にコピーするという操作をしていきます。

 

ここではstring.hを使用するのでstdio.hの次にインクルードしましょう。


#include<stdio.h>
#include<string.h>
int main(void)
{
	char text1[10]="hello";
	char text2[10];
	
	strcpy(text2,text1);
	
	printf("text1は%sです。\n",text1);
	printf("text2は%sです。\n",text2);
	return 0;
}

ここで重要なのはstrcpy(text2,text1);というところです。

 

日本語での意味はtext1の文字列をtext2にコピーするということです。

 

配列の先頭要素のアドレス書き込みます。(ポインタでもいいです。)

 

このやり方を利用しなくても、for文を使用することで文字列をコピーすることができますが、こちらのほうが簡単でしょう。

 

文字列を連結(追加)する

文字同士をつなげて配列に格納したいときにもstring.hを使用します。


#include<stdio.h>
#include<string.h>
int main(void)
{
	char text1[10]="hello";
	char text2[10]="good";
	
	strcat(text1,text2);
	
	printf("text1は%sです。\n",text1);

	return 0;
}

ここでは、text1の後ろにtext2を連結させた文字列をtext1に格納しています。

 

文字列の比較


#include<stdio.h>
#include<string.h>
int main(void)
{
	char text1[10];
	char text2[10];
	int cm;
	
	scanf("%s",text1);
	scanf("%s",text2);
	
	cm=strcmp(text1,text2);
	
	if(cm==0)
	{
		printf("同じ長さです。\n");
	}
	else
	{
		printf("長さが違います。\n");
	}
	
	return 0;
}

ここでは、文字列の長さを比較しています。

 

strcmp(text1,text2)では、ひとしい場合は0を返し、異なっている場合は0以外を返します。

 

if文で条件分岐することで、それぞれの結果を出力することができます。

 

ポインタと文字列の関係

ここでは文字列の表し方について紹介します。

文字列には大きく分けて2種類の表し方があります。

 

文字列を配列で表す


#include<stdio.h>
int main(void)
{
	char text[10]="hello";
	printf("%s\n",text);
	return 0;
}

これはtextの配列を宣言し”hello”で初期化しています。

 

文字列をポインタで表す


#include<stdio.h>
int main(void)
{
	char *text="hello";
	printf("%s\n",text);
	return 0;
}

これはchar*型を宣言し初期化しています。

 


どちらも出力結果は同じです。

 

しかし、微妙な違いがあります。

 

違いその1 途中で代入ができない

配列で宣言した場合は途中で代入することができません。

 

例えば


#include<stdio.h>
int main(void)
{
	char text[10]="hello";
	text[10]="good";
	printf("%s\n",text);
	return 0;
}

ということができないのです。

 

初期化でしか、値を代入できません。

 

しかし、for文を利用して一つ一つ代入していけば値を入れ替えることができます。

 

ポインタを利用する場合はここら辺がすんなりとできます。

 


#include<stdio.h>
int main(void)
{
	char *text="hello";
	text="good";
	printf("%s\n",text);
	return 0;
}

これはうまく実行することができます。

 

ポインタで宣言することによって、このようなことができます。

 

一見便利に見えますが、使っているメモリを図りにくいので注意が必要です。

 

豆知識

stdio.hやstring.hなどは標準で用意されています。

 

このようなヘッダーファイルをインクルードして利用できる関数を「標準ライブラリ関数」といいます。

 

printfやscanfなどがそうです。

 

これらを覚えておくと、プログラムを作成するときに役に立つはずです。

 

まとめ

文字列を利用する場面はかなりたくさんあります。

 

僕がゲームを作るときも、何かをユーザーに伝えるときのほとんどが文字です。

 

文字列の扱いは慣れておくに越したことはありません。