アプリ版:「スタンプのみでお礼する」機能のリリースについて

// 自作文字列比較関数
int my_strcmp(const char* s1, const char* s2)
{
// 先頭から走査して差があればループ終了
for(; *s1 == *s2; s1++, s2++)
{
// 終了前に終端文字が見つかったら差分なし
if(*s1 == '\0')
{
return 0;
}
}
return *s1 >*s2 ? 1 : -1;
}
というプログラムにおいて、正しく動く事は確認できました。しかし、
s1とs2が等しい時のif文や処理がどこにかいてあるのかわからないです。
どこに書いているのでしょうか?

また、s1とs2が一致したとしても関数が終了しないようにするにはどのように書き直せばよいでしょうか?

A 回答 (3件)

この関数の戻り値は以下の三つしかありません。


①s1がs2と等しいか短い場合に0
②相違有りでs1側の文字コードが大きい場合に1
③相違有りでs1側の文字コードが小さい場合に-1

s1="ありがとう"
s2="ありがとうございます"
この場合0が返りますが等しくないですよね。
つまりこの関数は前方一致を検出したいだけ?

「s1とs2が一致したとしても関数が終了しない」って、終了条件が無いとプログラムがハングアップしますけど。
何がしたいのでしょう?
    • good
    • 1
この回答へのお礼

終了条件はs1の文字が¥0になったら終了です。

お礼日時:2020/06/21 13:39

「正しく動く事は確認できました。

」ってことは、
No.1 が書いている仕様で意図どおりだってことでしょうか?

そうではなくて、const char* s1 と const char* s2 の指す
文字列が一致したときに 0 を返す関数にしたいなら、
if(*s1 == '\0') を if(*s1 == '\0' && *s2 == '\0') に変えたらどうでしょう。
s1 と s2 が等しい時の if 文や処理をどこにも書いてなかったから
こうなったのです。

「s1とs2が一致したとしても関数が終了しないようにする」というのが
関数を終了する前にまだ何か作業したいという意味であれば、
return 0; の直前にその作業を書けばよいと思います。
    • good
    • 1
この回答へのお礼

もしかしたら、誤作動で正しく動いていただけかも知れません。
一致したとしてもs1が¥0になるまでループするようにしたいです。

お礼日時:2020/06/21 13:41

>s1とs2が等しい時のif文や処理がどこにかいてあるのかわからないです。


「s1とs2が等しい時」はfor文の中ですね

>また、s1とs2が一致したとしても関数が終了しないようにするにはどのように書き直せばよいでしょうか?
return 0;
で関数を終了しているので、ここを書き換えれば良いのでは?

>s1="ありがとう"
>s2="ありがとうございます"
>この場合0が返りますが等しくないですよね。
*s1 == '\0'のときはforループの外に出ているので0は返らないとおもいますけど・・
    • good
    • 0
この回答へのお礼

なるほど、returnの部分でs1++とすれば良いのかも知れません

お礼日時:2020/06/21 14:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!