0

入力された char* の長い方を返し、それをコンソールに出力する単純な関数を作成しました。両方の char* が等しい場合でも、何らかの形でセグメンテーション違反が発生することが予想されますが、毎回 2 番目の char* がコンソールに出力されます。これはコンパイラの最適化の一種ですか、それとも何か不足していますか?

サンプル入力: ./longer test test2 番目の「テスト」(argv[2]) を出力します。

好奇心からclangとgccの両方を試してみましたが、同じ結果でした。

#include<stdio.h>

char* longer(char *, char *);

int main(int argc, char *argv[]) {
    printf("%s", longer(argv[1], argv[2]));
    return 0;
}

char* longer(char* s1, char* s2) {
    char *first, *second;
    for(first = s1, second = s2; *s1 && *s2; s1++, s2++);
    return *s1 > *s2 ? first : second;
}

明確にするために、null バイトでループが壊れているため、長い関数は現在の位置の ascii 値を比較しています。本質的に、比較は 0 > 0 ですよね?

4

4 に答える 4

0

0 > 0は偽です。(それは理にかなっています。ゼロはゼロより大きくありません)。

false であるため、2 番目の文字列が返されます。これは、条件が false の場合に三項演算子が返すように指定されているためです。

于 2013-06-24T18:19:46.800 に答える
0

return *s1 > *s2 ? first : second;システムが signed char を使用していて、0x7F を超える文字を含む文字列を入力した場合にも、条件は失敗する可能性があります。より良くて簡単なのは次のとおりです。

return *s1 ? first : second;
于 2013-06-24T18:29:57.507 に答える
0

何かを返さなければなりません。したがって、「true」または「false」に基づいて返されます。s1 が s2 より大きくない場合、false を返します。この場合、文字列「second」です。

于 2013-06-24T18:26:27.803 に答える