博士

文字のコピーを関数で自作したのう。
今度は文字列操作の標準関数1「複写と結合の関数」を覚えようかの。


ぷうさん「怒」

えーっ!標準関数があったんなら、わざわざ自作でmojicopy関数なんかやらなくてもよかったじゃないっ!


博士「(^^♪」

ふぉっふぉっふぉっふぉ!
まあ、物事には段階というものがあっての。順序よくやっていった方が理解しやすいんじゃ。
それじゃ始めるとするかのお。

ヘッダ・ファイル

博士

と、その前に文字操作の標準関数が入っているヘッダファイルの紹介じゃ。


string.h

#include <string.h>

文字列操作の標準関数1「複写と結合」

博士「ここをチェックじゃ」

まず、関数をあげておくぞ。よいかな?


困った顔のぷうさん

・・・なんか面倒くさそう・・・・


困った顔の博士

まあ、そう言わずに!


ぷうさん「怒」

ふう・・・覚えることばっかだあっ!

string.hで定義されている標準関数

strcpy
例:strcpy (s1,s2);
文字列s1をs2にコピーし、s2を返す(上書き)。
※「/0」も含めてコピー
strncpy
例:strncpy (s1,s2,n);
文字列s1を最大n字だけs2にコピーしs2を返す(上書き)。
※文字列s1の長さがnより大きいと「/0」がコピーされない
strcat
例:strcat (s1,s2);
文字列s1をs2の終わりに結合し、s2を返す。
※文字列s2の最後の「/0」にs1の1文字目が結合される
strncat
例:strncat (s1,s2,n);
文字列s1を最大n字だけ、s2の終わりに結合し、s2を返す。
※s2の最後には必ず「/0」がつけられる

博士「Good!」

以上じゃ。
では、実際にそれらを使ったプログラムを。
・・・きちんとフローチャートを書くんじゃぞ、面倒でもな。


ぷうさん

了解!

文字列の複写と結合のプログラム

#include <stdio.h>
#include <string.h>
main()
{
   char s1[20]="ABCDE";
   char s2[20]="OPQRS";
   printf("1:%s %s\n",s1,s2);
   //s2にs1をコピー
   strcpy (s2,s1);
   printf("2:%s %s\n",s1,s2);
   //s2に12345とコピー ※
   printf("3:%s %s\n",s1,strcpy (s2,"12345"));

   //s2にs1の先頭から3文字をコピー
   strncpy (s2,s1,3);
   printf("4:%s %s\n",s1,s2);
   //s2に67890とコピー
   strcpy (s2,67890);
   printf("5:%s %s\n",s1,s2);
   //s2にs1の頭から3文字をコピー ※
   // \nはコピーされない
   printf("6:%s %s\n",s1,strncpy (s2,s1,3));

   //s2にFGHIJとコピー
   strcpy (s2,"FGHIJ");
   printf("7:%s %s\n",s1,s2);

   //s2にKLMNOを連結コピー
   strcat (s2,"KLMNO");
   printf("8:%s %s\n",s1,s2);

   //s2にs1の先頭から3文字ABCを連結
   // 連結後に\nがついている
   strncat (s2,s1,3);
   printf("9:%s %s\n",s1,s2);
}
博士「ここをチェックじゃ」

※関数自身がs2のアドレスを持っているので、printfの引数に直接書けるぞい。

実行結果

1:ABCDE OPQRS
2:ABCDE ABCDE
3:ABCDE 12345
4:ABCDE ABC45
5:ABCDE 67890
6:ABCDE ABC90
7:ABCDE FGHIJ
8:ABCDE FGHIJKLMNO
9:ABCDE FGHIJKLMNOABC








博士

どうじゃ?机上シュミレートと合っていたかの?


ぷうさん「×」

・・・・今必死にやってるとこ!

文字列操作の標準関数2「比較と検索」

博士「ここをチェックじゃ」

お次は、文字列の比較と検索「文字列操作の標準関数2」じゃ。


困った顔のぷうさん

・・・ち、ちょっとたんまっ!・・・


困った顔の博士

なんじゃ、まだ終わってないのか?


困った顔のぷうさん

だってえ・・・

///Please wait for a while………

ぷうさん「(^^♪」

ふーう・・・ようやくできた!
・・・ん、ん、合ってる、合ってる!!


博士

それでは、進むぞい。

string.hで定義されている標準関数

strcmp
例:strcmp (s1,s2);
文字列s1とs2を比較する。

  • 文字列s1 < 文字列s2の場合 負の値を返す
  • 文字列s1 = 文字列s2の場合 0を返す
  • 文字列s1 > 文字列s2の場合 正の値を返す
strncmp
例:strncmp (s1,s2,n);
文字列s1とs2を先頭からn文字比較する。

  • 文字列s1 < 文字列s2の場合 負の値を返す
  • 文字列s1 = 文字列s2の場合 0を返す
  • 文字列s1 > 文字列s2の場合 正の値を返す
strlen
例:strlen (s1);
文字列s1の長さを返す。
※/0は含まない

文字操作標準関数「比較と検索」の使い方

博士「ここをチェックじゃ」

strcmp、strncmp共に、if文の条件としてよく使われるんじゃ。
「文字が一致したら」という判断じゃな。
 それと、文字列の大小関係とは、文字コード(数値)の大小じゃ。


困った顔のぷうさん

・・・わあっ!
ブレインダムドが、かかって・・・・・・・・


困った顔の博士

?????


ぷうさん「×」

Oh!No!!
(このネタは通じないか・・・)

◦文字列の比較と検索のプログラム

#include <stdio.h>
#include <string.h>
main()
{
   char s1[20]="ABCDE";
   char s2[20]="ABC123456";

   printf("strcmp1: %d\n",strcmp("A","B"));
   printf("strcmp2: %d\n",strcmp(s1,s2));
   printf("strcmp3: %d\n",strcmp(s2,s1));

   printf("strncmp1: %d\n",strncmp(s1,s2,3));
   printf("strncmp2: %d\n",strncmp(s1,s2,4));

   printf("strlen1: %d\n",strlen(s1));
   printf("strlen1: %d\n",strlen(s2));
}

実行結果

strcmp1: -1
strcmp2: 1
strcmp3: -1
strncmp1: 0
strncmp2: 1
strlen1: 5
strlen2: 8

ここをチェック

博士「ここをチェックじゃ」

文字の比較じゃが、AとBとでは、A<Bじゃから、負になるんじゃ。
ABCDEとABC123456はABCまで一致し、次のDと1を比較して、D>1じゃから、正になるんじゃぞ。


困った顔のぷうさん

ほ、ほ、ほ~たる来い!


困った顔の博士

お、おい、大丈夫かの?


ぷうさん「怒」

・・・何が楽しくて文字の比較なんかするんじゃいっ!


博士「×」

・・・・・わしに言われても困るんじゃが、まあ、いろいろと、あってな。


ぷうさん「×」

いろいろと・・・ああ、やはり手を出すべき世界じゃなかった!


博士

今更止めさせるわけにはいかんのじゃ。
さあ、次じゃ、次じゃ!


困った顔のぷうさん

・・・お許しくだせぇ・・・お代官さまぁ・・・・


博士「怒」

いいや、許さん!
なにがあっても、この本は終わらせるんじゃからの!


困った顔のぷうさん

ふぇ~ん…


博士

泣き脅しは効かんぞ、泣き脅しは!
どうせ涙なんか一筋も出てないんじゃろ?


ぷうさん「(^^♪」

じゃろはジャロ、誇大広告はお近くのジャロヘ!
(あああ、スペルがでない!JAROだったかJALOつだったか・・・JALは日本航空だ!・・・)


困った顔の博士

(・・無視するに限る・・・・)

その四 char型とint型の違いへ

四日目 文字列について 目次

三日目へ

ぷうさんの七日間戦争 四日目

五日目へ