プログラミング実習

プログラミング論
第十九回
・標準ライブラリ関数(文字列の処理)
本日の内容


標準ライブラリ関数とは?
文字列の処理
– 文字列の代入
– 文字列の長さを求める
– 文字列の比較
– 文字列の連結
標準ライブラリ関数とは?





プログラムは,いろんな処理を「関数」という単
位で行っています。
先週は,いくつかの関数を自作して利用する方
法を勉強しました。
しかし,C言語には,普段よく使う処理があらか
じめ関数として用意されています。
printf,scanf,などです。
これらの関数を「標準ライブラリ関数」と呼びま
す。
標準ライブラリ関数とは?
どこで定義
#include <stdio.h> されているの
int main(void)
これが標
でしょう??{
double f( double x)
double x,y; 準ライブラ
リ関数です
{
double y;
printf("x=?");
これは自作 scanf("%lf", &x);
の関数です
y = x*x+3*x+2;
y = f(x);
return y;
}
printf("y=%f\n",y);
}
ここで定義(説明)されています
標準ライブラリ関数とは?
#include <stdio.h>
printf( ・・・・ )
{
int
main(void)
・・・・・
{ ・・・・・
}
double f( double x)
double x,y;
ここで定義scanf( ・・・・ )
{
{
されている
double y;
printf("x=?");
・・・・・
のです!!} scanf("%lf", &x);
y = x*x+3*x+2;
y = f(x);
return y;
}
printf("y=%f\n",y);
}
標準ライブラリ関数とは?




printf()やscanf()などの標準ライブラリ関数は,
「ヘッダファイル」の中に種類毎に整理して保存
されています。
printf()やscanf()は,入出力に関する関数なの
で,そのような関数を集めた,「stdio.h」という
ヘッダファイルの中にその定義(説明)が書いて
あります。
そのヘッダファイルを「include(含む)」処理する
と,そのヘッダファイルの中にある関数が使え
る,という訳です。
stdioは,STanDard Input Outputの略で,「標
準入出力」という意味になります。
文字列の処理



C言語には,文字列を処理するための便利な関
数が用意されています。
これらの関数は,「string.h」というヘッダーファ
イルに定義されているので,これをincludeして
利用します。
次のような関数があります。
–
–
–
–
文字列の代入(コピー)
文字列の長さを求める
文字列を比較する
文字列を連結する
文字列の処理
文字列の代入(コピー)

char型では,1文字しか扱えません。
a
char a; a=‘C’;

‘C’
配列にすると文字列が入力出来ますが・・
char a[4];
h
a
m
a
a[0] a[1] a[2] a[3]
文字列の処理
文字列の代入(コピー)

その入力方法は一文字ずつになってしまい,
char a[4];
a[0]=‘h’;
a[1]=‘a’;
a[2]=‘m’;
a[3]=‘a’;
hama
h
a
m
a
a[0] a[1] a[2] a[3]
なかなか面倒です。。。
文字列の処理
文字列の代入(コピー)

ところが,string.hにあるstrcpy()関数を使
うと,簡単に文字列の代入ができます!
hama
char a[4];
strcpy(a,”hama”);
h
a
m
a
a[0] a[1] a[2] a[3]
文字列の処理
文字列の代入(コピー)

ensyu54.cで関数strcpyの動作を確認し
ましょう。
文字列の処理
文字列の長さを求める



文字列の長さ(文字数)を求める時は,
strlen( )関数を用います。
strlen( )関数は,返り値として文字数を返
します。
ensyu55.cで動作を確認しましょう。
文字列の処理
文字列の長さを求める


それでは,文字列の長さを求める関数を自分で
作ってみましょう。
ヒント
– 文字列の最後には,’\0’が保存されています。
– ‘\0’を発見するまで文字をカウントしていけばよいこ
とになります。
– 次のスライドのフローチャートを参考に考えてみま
しょう。

ensyu56.cを完成させてください。
文字列の処理
文字列の長さを求める
n=0; i=0;
No
s[i] !=‘\0’
Yes
n++;
i++;
printf(“文字数=%d\n”,n);
文字列の処理
文字列を比較する


2つの文字列を比較する時は,strcmp( )
関数を用います。
二つの文字列を比較して,同じ場合は0
を返り値として返します。
– 返り値は整数型です。


文字列が異なる場合は,どのような結果
が返ってくるでしょう?
ensyu57.cで確認してください。
文字列の処理
文字列を比較する

二つの文字列が同じ場合の出力
文字列を入力してください(s1)
abcdef
文字列を入力してください(s2)
abcdef
文字列を比較します。。
比較結果は0です。
文字列の処理
文字列を比較する

二つの文字列が異なる場合の出力
文字列を入力してください(s1)
abcdef
文字列を入力してください(s2)
ghijkl
文字列を比較します。。
比較結果は-1です。
文字列を入力してください(s1)
efghijkl
文字列を入力してください(s2)
abcdefgh
文字列を比較します。。
比較結果は1です。
この違いは,どうして起こるのでしょう?
文字列の処理
文字列を比較する

strcpy(s1, s2); の結果
返り値
意味
文字コードの比較
1
s1 > s2
s1の文字コードが大きい
0
s1 == s2
-1
s1 < s2
s1の文字コードが小さい
*文字コードが「大きい」とは,その文字が辞書内で後ろにある事を意味します
文字列の処理
文字列を比較する



ある文字列の中から,キーワードを検索するプ
ログラムを作ってみましょう。
キーワードは,3文字の文字列とします。
ヒント
– 文字列から,順に3文字ずつ抜き出して,キーワード
と比較します。比較にはstrcmp( )を利用します。
– 一致したら,「一致しました」と表示し,何文字目に
あったかを表示します。
– この処理を文字列の最後まで繰り返します。

ensyu58.cを完成させてください。
文字列の処理
文字列を連結する

文字列同士をつなげて一つの文字列に
する時には,strcat( )関数を使います。
strcpy(s1, “ABCD”);
strcpy(s2, “EFGH”);
strcat(s1, s2); を実行すると。。
s1の文字列が,”ABCDEFGH”となります
*ensyu59.cで動作を確認しましょう。