2

strcmp_kr 関数は、K&R の文字列比較関数に基づいています。

#include<stdio.h>
#include<string.h>

int strcmp_kr (char *s, char *d) {

int i=0;

    while ((s[i] == d[i])) {
        printf("Entered while loop\n");
        if (s[i] == '\0')
            return 0;
        i++;
    }
    return s[i] - d[i];
}

int main() {

char s1[15];
char s2[15];
printf("Enter string no. 1:");
scanf("%s", s1);
printf("Enter string no. 2:");
scanf("%s", s2);
strcmp_kr(s1, s2) == 0 ? printf("Strings equal!\n") : \
printf("Strings not equal by %d!\n", strcmp_kr(s1, s2));

}

出力:

$ ./a.out

文字列番号を入力してください。1:控えめ

文字列番号を入力してください。2:モデジー

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

whileループに入りました

文字列は -5 ではありません!

質問: while ループが 5 回ではなく 10 回入っているのはなぜですか?

4

2 に答える 2

8
strcmp_kr(s1, s2) == 0 ? printf("Strings equal!\n") : \
printf("Strings not equal by %d!\n", strcmp_kr(s1, s2));

strcmp_kr(s1, s2)最初は状態で、2 回目はprintf状態がであるため、2 回呼び出したfalseので、10 回の印刷メッセージが表示されます。

これを回避するには、戻り値を次のような変数に格納します

int rtn = strcmp_kr(s1, s2);
rtn == 0 ? printf("Strings equal!\n") : \
printf("Strings not equal by %d!\n", rtn);
于 2013-07-10T00:15:05.480 に答える
2

関数を 2 回呼び出しています。

strcmp_kr(s1, s2) == 0 ? printf("Strings equal!\n") : \ printf("Strings not equal by %d!\n", strcmp_kr(s1, s2)) ;

最初の呼び出しは false と評価され、関数を再度呼び出します。

乾杯!

于 2013-07-10T00:21:50.907 に答える