演習
入力した二つの文字列が等しければ と出力し、そうでなければと出力するプログラム をポインタを用いて作成せよ。
【コメント】
¯ ポインタ の値を増やすために「 」としているプログラムがあったが、ポインタ の値を増やすだけであれば「 」を使うべきである 。「 」でも の値は増え るが、通常この表現は、ポインタ が指している場所に値を格納したり、あるいは、そこ に格納されている値を利用その値を他の変数に代入したり他の値と比較するなどしてから
を増やす場合に用いる。
使用例:
ポインタ が指している場所に格納されている値を
変数に代入してから を増やす
変数の値をポインタ が指している場所に
格納してから を増やす
が指している場所に格納されている値が
文字で無い間 を増やして「」と「」
で囲まれた部分を繰り返し実行する
‥‥
を増やす
¯ 文字列の比較がうまく出来ていないプログラムがある。
先頭の 文字しか比較していない。
£ 例えば文字列 がで文字列がの時に「」と出力してしまう。
!"#$ ! !"# 文字列$ 文字列!を格納する配列
$ ! $ ! は 型へのポインタ 文字列$ 文字列!を入力し配列$ !に格納
%& 文字列
! ! ! %& 文字列!
' ! 先頭の文字しかチェックしていない
'((
'( (
「 」のかわりに「 」を用いると、コンパイル時に「
」という警告が出ることがある(コンパイラのバージョンやデフォルト設定に依存)。これは、「」により が指 している場所を参照しているにも関わらず参照した値を使っていないという警告である。
先頭の 文字は比較せずに文字目以降を比較している。
£ 例えば文字列 がで文字列がの時に「」と出力してしまう。
!"#$ ! !"# 文字列$ 文字列!を格納する配列
$ ! $ ! は 型へのポインタ 文字列$ 文字列!を入力し配列$ !に格納
%& 文字列
! ! ! %& 文字列!
)) ** ! ))
! ここでポインタを増やしているため
先頭の文字がチェックされない
'文の後に移動すべきである
' !
'((
+,
' ! '( (
文字目だけ比較している。
£ 例えば文字列 がで文字列がの時に「」と出力してしまう。
!"#$ ! !"# 文字列$ 文字列!を格納する配列
$ ! $ ! は 型へのポインタ 文字列$ 文字列!を入力し配列$ !に格納
%& 文字列
! ! ! %& 文字列!
))
!
' ! !文字目しかチェックしていない
'((
+,
'( (
+,
最後の文字だけ比較している。
£ 例えば文字列 がで文字列がの時に「」と出力してしまう。
!"#$ ! !"# 文字列$ 文字列!を格納する配列
$ ! $ ! は 型へのポインタ
'-
文字列$ 文字列!を入力し配列$ !に格納
%& 文字列
! ! ! %& 文字列!
)) .. ! ))
' ! 今チェックしている文字の比較結果で
'- '-の値を上書きしている
'-
!
''- '-の値は最後の比較結果
'( (
'((
一方の文字列が他方の文字列の先頭部分と一致する場合に両者が等しいと判定している。
£ 例えば文字列 がで文字列がの時に「」と出力してしまう。
!"#$ ! !"# 文字列$ 文字列!を格納する配列
$ ! $ ! は 型へのポインタ 文字列$ 文字列!を入力し配列$ !に格納
%& 文字列
! ! ! %& 文字列!
))
' !
'((
/
!
'( ( ここが間違い。
「' ! )) '( (
'((」とすべき
文字列の比較ではなくポインタの比較を行っている。
£ 同じ文字列を入力しても「」と出力してしまう。
文字列の比較ではなく、文字列の長さのの比較を行っている。
£ 異なる文字列でも長さが同じだと「」と出力してしまう。
¯ ポインタを用いずに、配列の形( #等でプログラムしていたり、文字列の比較に標準 ライブラリ内の関数 を用いているプログラムがあったが、この演習では文字列の表現 を理解しポインタを利用した操作を理解することを目的としているため、配列の形や の使用は題意に反していると考える。
¯ 作成したプログラムの正しさをチェックするために、種々の文字列の組み合わせに対して正し い結果が得られるかどうかを試してみることが重要である。この課題の場合、例えば、次の ような文字列の組み合わせに対して正しい結果が得られるかどうかをチェックすべきであろう。
文字列 文字列 出力 コメント
完全一致
最初の文字は一致
最後の文字は一致
文字列の先頭部分が文字列 に一致
文字列 の先頭部分が文字列に一致
¯ 入力された文字列の長さを求めてから比較を行っているプログラムがあったが、文字列の長 さを求めることなく比較することは可能である。
【文字列比較のヒント】
ポインタ変数
と
が指している文字列の比較
方法
が文字でなく、かつ、 も文字ではなく、かつ、 と が等しい間、 と を一つ増やす。
と が等しければ「」、等しくなければ「」と出力。
方法 方法Aでは、文字列の最後に達したかどうかの判定と、文字が一致しているかの判定 を同時に行っているため、 の繰り返し条件が少し繁雑になっている。文字列の最後に 達したかどうかの判定と、文字が一致しているかの判定を分けると、繰り返し条件は少し簡 単になる。
方法
が文字でなく、かつ、 も文字でない間、以下を繰り 返す。
と が等しくなければ「」と出力して終了
と を一つ増やす
と が等しければ「」、等しくなければ「」を出力 方法
と が等しい間、以下を繰り返す。
が文字なら、「」と出力して終了
と を一つ増やす
「」を出力
を抜けてきたので、 が文字であるか、あるいは、 が文字であるか、あるいは、
≠ のいずれかである。したがって、 と が等しいときは、 ともに文字である。すなわち、
つの文字列は先頭から最後まで一致していることになる。
を抜けてきたので、 が文字であるか、あるいは、 が文字であるかのいずれかである。
したがって、 と が等しいときは、両方とも文字であり、 つの文字列は先頭から最後まで一致している ことになる。
この時、 と は等しいので も文字。したがって、 つの文字列は先頭から最後まで一致してい ることになる。
を抜けてきたので、 ≠ である。